Changeset 32933 in vbox for trunk/src/VBox/Devices/Audio
- Timestamp:
- Oct 6, 2010 8:55:41 AM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 66419
- Location:
- trunk/src/VBox/Devices/Audio
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/DevCodec.cpp
r32805 r32933 174 174 case 6: 175 175 pNode->adc.node.name = "ADC0"; 176 pNode->node.au 8F02_param[0] = 0x17;176 pNode->node.au32F02_param[0] = 0x17; 177 177 goto adc_init; 178 178 case 7: 179 179 pNode->adc.node.name = "ADC1"; 180 pNode->node.au 8F02_param[0] = 0x18;180 pNode->node.au32F02_param[0] = 0x18; 181 181 adc_init: 182 182 pNode->adc.u32A_param = RT_BIT(14)|(0x1 << 3)|0x1; /* 441000Hz/16bit/2ch */ … … 203 203 pNode->node.au32F00_param[0xA] = RT_BIT(17)|RT_BIT(5); 204 204 pNode->node.au32F00_param[0xE] = RT_BIT(0); 205 pNode->node.au 8F02_param[0] = 0x11;205 pNode->node.au32F02_param[0] = 0x11; 206 206 pNode->spdifin.node.au32F00_param[0xB] = RT_BIT(2)|RT_BIT(0); 207 207 pNode->spdifin.u32F06_param = 0; … … 211 211 pNode->node.name = "PortA"; 212 212 pNode->node.au32F00_param[0xC] = 0x173f; 213 *(uint32_t *)pNode->node.au8F02_param= 0x2;213 pNode->node.au32F02_param[0] = 0x2; 214 214 pNode->port.u32F07_param = RT_BIT(6); 215 215 pNode->port.u32F08_param = 0; … … 221 221 pNode->node.name = "PortB"; 222 222 pNode->node.au32F00_param[0xC] = 0x1737; 223 *(uint32_t *)pNode->node.au8F02_param= 0x4;223 pNode->node.au32F02_param[0] = 0x4; 224 224 pNode->port.u32F09_param = 0; 225 225 pNode->port.u32F07_param = RT_BIT(5); … … 229 229 case 0xC: 230 230 pNode->node.name = "PortC"; 231 *(uint32_t *)pNode->node.au8F02_param= 0x3;231 pNode->node.au32F02_param[0] = 0x3; 232 232 pNode->node.au32F00_param[0xC] = 0x1737; 233 233 pNode->port.u32F09_param = 0; … … 241 241 pNode->port.u32F09_param = 0; 242 242 pNode->port.u32F07_param = RT_BIT(6); 243 *(uint32_t *)pNode->node.au8F02_param= 0x2;243 pNode->node.au32F02_param[0] = 0x2; 244 244 if (!pState->fInReset) 245 245 pNode->port.u32F1c_param = 0x01013040; /* Line Out */ … … 268 268 if (!pState->fInReset) 269 269 pNode->port.u32F1c_param = RT_MAKE_U32_FROM_U8(0x12, 0x60, 0x11, 0x01); 270 pNode->node.au 8F02_param[0] = 0x5;270 pNode->node.au32F02_param[0] = 0x5; 271 271 pNode->port.u32F09_param = 0; 272 272 break; … … 278 278 pNode->digout.u32F01_param = 0; 279 279 /* STAC9220 spec defines default connection list containing reserved nodes, that confuses some drivers. */ 280 *(uint32_t *)pNode->node.au8F02_param= RT_MAKE_U32_FROM_U8(0x08, 0x17, 0x19, 0);280 pNode->node.au32F02_param[0] = RT_MAKE_U32_FROM_U8(0x08, 0x17, 0x19, 0); 281 281 pNode->digout.u32F07_param = 0; 282 282 if (!pState->fInReset) … … 308 308 /* STAC 9220 v10 6.21-22.{4,5} both(left and right) out amplefiers inited with 0*/ 309 309 memset(pNode->adcmux.B_params, 0, AMPLIFIER_SIZE); 310 *(uint32_t *)&pNode->node.au8F02_param[0] = RT_MAKE_U32_FROM_U8(0xe, 0x15, 0xf, 0xb);311 *(uint32_t *)&pNode->node.au8F02_param[4] = RT_MAKE_U32_FROM_U8(0xc, 0xd, 0xa, 0x0);310 pNode->node.au32F02_param[0] = RT_MAKE_U32_FROM_U8(0xe, 0x15, 0xf, 0xb); 311 pNode->node.au32F02_param[4] = RT_MAKE_U32_FROM_U8(0xc, 0xd, 0xa, 0x0); 312 312 break; 313 313 case 0x14: … … 331 331 pNode->node.au32F00_param[0x13] = RT_BIT(7)| 0x7F; 332 332 pNode->node.au32F00_param[0xe] = 0x4; 333 *(uint32_t *)pNode->node.au8F02_param= RT_MAKE_U32_FROM_U8(0x2, 0x3, 0x4, 0x5);333 pNode->node.au32F02_param[0] = RT_MAKE_U32_FROM_U8(0x2, 0x3, 0x4, 0x5); 334 334 pNode->volumeKnob.u32F08_param = 0; 335 335 pNode->volumeKnob.u32F0f_param = 0x7f; … … 337 337 case 0x17: 338 338 pNode->node.name = "ADC0Vol"; 339 *(uint32_t *)pNode->node.au8F02_param= 0x12;339 pNode->node.au32F02_param[0] = 0x12; 340 340 goto adcvol_init; 341 341 case 0x18: 342 342 pNode->node.name = "ADC1Vol"; 343 *(uint32_t *)pNode->node.au8F02_param= 0x13;343 pNode->node.au32F02_param[0] = 0x13; 344 344 adcvol_init: 345 345 memset(pNode->adcvol.B_params, 0, AMPLIFIER_SIZE); … … 363 363 pNode->node.au32F00_param[0x9] = (0x4 << 20)|RT_BIT(9)|RT_BIT(8)|RT_BIT(0); 364 364 pNode->node.au32F00_param[0xE] = 0x1; 365 pNode->node.au 8F02_param[0] = 0x1a;365 pNode->node.au32F02_param[0] = 0x1a; 366 366 pNode->reserved.u32F07_param = 0; 367 367 pNode->reserved.u32F1c_param = 0x400000fb; /* dumped from real stac9220 chip */ … … 372 372 return VINF_SUCCESS; 373 373 } 374 375 /* ALC885 */ 376 const static uint8_t au8Alc889aPorts[] = { 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0}; 377 const static uint8_t au8Alc889aDacs[] = { 0x2, 0x3, 0x4, 0x5, 0x25, 0}; 378 const static uint8_t au8Alc889aAdcs[] = { 0x7, 0x8, 0x9, 0}; 379 const static uint8_t au8Alc889aSpdifOuts[] = { 0x6, 0 }; 380 const static uint8_t au8Alc889aSpdifIns[] = { 0xA, 0 }; 381 const static uint8_t au8Alc889aDigOutPins[] = { 0x1E, 0 }; 382 const static uint8_t au8Alc889aDigInPins[] = { 0x1F, 0 }; 383 const static uint8_t au8Alc889aAdcVols[] = { 0xE, 0xF, 0xD, 0xC, 0x26, 0xB, 0}; 384 const static uint8_t au8Alc889aAdcMuxs[] = { 0x22, 0x23, 0x24, 0}; 385 const static uint8_t au8Alc889aPcbeeps[] = { 0x1D, 0 }; 386 const static uint8_t au8Alc889aCds[] = { 0x1C, 0 }; 387 const static uint8_t au8Alc889aVolKnobs[] = { 0x21, 0 }; 388 const static uint8_t au8Alc889aReserveds[] = { 0x10, 0x11, 0x12, 0x13, 0 }; 389 390 391 static int alc885ResetNode(struct CODECState *pState, uint8_t nodenum, PCODECNODE pNode); 392 393 static int alc885Construct(CODECState *pState) 394 { 395 unconst(pState->cTotalNodes) = 0x27; 396 pState->pfnCodecNodeReset = alc885ResetNode; 397 pState->pNodes = (PCODECNODE)RTMemAllocZ(sizeof(CODECNODE) * pState->cTotalNodes); 398 pState->fInReset = false; 399 #define ALC885WIDGET(type) pState->au8##type##s = au8Alc889a##type##s 400 ALC885WIDGET(Port); 401 ALC885WIDGET(Dac); 402 ALC885WIDGET(Adc); 403 ALC885WIDGET(AdcVol); 404 ALC885WIDGET(AdcMux); 405 ALC885WIDGET(Pcbeep); 406 ALC885WIDGET(SpdifIn); 407 ALC885WIDGET(SpdifOut); 408 ALC885WIDGET(DigInPin); 409 ALC885WIDGET(DigOutPin); 410 ALC885WIDGET(Cd); 411 ALC885WIDGET(VolKnob); 412 ALC885WIDGET(Reserved); 413 #undef ALC885WIDGET 414 /* @todo: test more */ 415 unconst(pState->u8AdcVolsLineIn) = 0x1a; 416 unconst(pState->u8DacLineOut) = 0x0d; 417 418 return VINF_SUCCESS; 419 } 420 421 static int alc885ResetNode(struct CODECState *pState, uint8_t nodenum, PCODECNODE pNode) 422 { 423 pNode->node.id = nodenum; 424 switch (nodenum) 425 { 426 case 0: /* Root */ 427 pNode->node.au32F00_param[0] = (0x10EC /* Realtek */ << 16) | 0x885 /* device */; 428 pNode->node.au32F00_param[2] = RT_BIT(20); /* Realtek 889 (8.1.9)*/ 429 pNode->node.au32F00_param[4] = (1 << 16)|0x1; /* start node 1, total 1*/ 430 pNode->node.au32F00_param[0xA] = RT_BIT(17)|RT_BIT(5); 431 432 break; 433 case 0x1: /* AFG */ 434 pNode->node.au32F00_param[4] = (2 << 16)|0x25; /* start node 1, total 1*/ 435 pNode->node.au32F00_param[5] = RT_BIT(8) | 0x1; /* UnSol: enabled, function group type: AFG */ 436 pNode->node.au32F00_param[0xa] = 0xe0560; 437 pNode->afg.u32F20_param = 0x10ec0889; 438 pNode->node.au32F00_param[0xB] = 0x1; 439 break; 440 /* DACs */ 441 case 0x2: 442 pNode->node.name = "DAC-0"; 443 goto dac_init; 444 case 0x3: 445 pNode->node.name = "DAC-1"; 446 goto dac_init; 447 case 0x4: 448 pNode->node.name = "DAC-2"; 449 goto dac_init; 450 case 0x5: 451 pNode->node.name = "DAC-3"; 452 goto dac_init; 453 case 0x25: 454 pNode->node.name = "DAC-4"; 455 dac_init: 456 pNode->node.au32F00_param[0xA] = RT_BIT(17)|RT_BIT(5); 457 pNode->node.au32F00_param[0x9] = 0x11; 458 pNode->node.au32F00_param[0xB] = 0x1; 459 pNode->dac.u32A_param = (1<<14)|(0x1<<4) | 0x1; 460 break; 461 /* SPDIFs */ 462 case 0x6: 463 pNode->node.name = "SPDIFOUT-0"; 464 pNode->node.au32F00_param[0x9] = 0x211; 465 pNode->node.au32F00_param[0xB] = 0x1; 466 pNode->node.au32F00_param[0xA] = RT_BIT(17)|RT_BIT(5); 467 pNode->spdifout.u32A_param = (1<<14)|(0x1<<4) | 0x1; 468 break; 469 case 0xA: 470 pNode->node.name = "SPDIFIN-0"; 471 pNode->node.au32F00_param[0x9] = 0x100391; 472 pNode->node.au32F00_param[0xA] = 0x1e0560; 473 pNode->node.au32F00_param[0xB] = 0x1; 474 pNode->node.au32F02_param[0] = RT_MAKE_U32_FROM_U8(0x1F, 0, 0, 0); 475 pNode->node.au32F02_param[1] = RT_MAKE_U32_FROM_U8(0x1F, 0, 0, 0); 476 pNode->node.au32F02_param[2] = RT_MAKE_U32_FROM_U8(0x1F, 0, 0, 0); 477 pNode->node.au32F02_param[3] = RT_MAKE_U32_FROM_U8(0x1F, 0, 0, 0); 478 pNode->node.au32F00_param[0xA] = RT_BIT(17)|RT_BIT(5); 479 pNode->spdifin.u32A_param = (1<<14)|(0x1<<4) | 0x1; 480 break; 481 /* VENDOR DEFINE */ 482 case 0x10: 483 pNode->node.name = "VENDEF-0"; 484 goto vendor_define_init; 485 case 0x11: 486 pNode->node.name = "VENDEF-1"; 487 goto vendor_define_init; 488 case 0x12: 489 pNode->node.name = "VENDEF-2"; 490 goto vendor_define_init; 491 case 0x13: 492 pNode->node.name = "VENDEF-3"; 493 goto vendor_define_init; 494 case 0x20: 495 pNode->node.name = "VENDEF-4"; 496 vendor_define_init: 497 pNode->node.au32F00_param[0x9] = 0xf00000; 498 break; 499 500 /* DIGPIN */ 501 case 0x1E: 502 pNode->node.name = "DIGOUT-1"; 503 pNode->node.au32F00_param[0x9] = 0x400300; 504 pNode->node.au32F00_param[0xE] = 0x1; 505 pNode->port.u32F1c_param = 0x14be060; 506 pNode->node.au32F00_param[0xC] = RT_BIT(4); 507 /* N = 0~3 */ 508 pNode->node.au32F02_param[0] = RT_MAKE_U32_FROM_U8(0x6, 0x0, 0x0, 0x0); 509 pNode->node.au32F02_param[1] = RT_MAKE_U32_FROM_U8(0x6, 0x0, 0x0, 0x0); 510 pNode->node.au32F02_param[2] = RT_MAKE_U32_FROM_U8(0x6, 0x0, 0x0, 0x0); 511 pNode->node.au32F02_param[3] = RT_MAKE_U32_FROM_U8(0x6, 0x0, 0x0, 0x0); 512 break; 513 case 0x1F: 514 pNode->node.name = "DIGOUT-0"; 515 pNode->node.au32F00_param[9] = 0x400200; 516 /* N = 0~3 */ 517 pNode->node.au32F02_param[0] = RT_MAKE_U32_FROM_U8(0xA, 0x0, 0x0, 0x0); 518 pNode->node.au32F02_param[1] = RT_MAKE_U32_FROM_U8(0xA, 0x0, 0x0, 0x0); 519 pNode->node.au32F02_param[2] = RT_MAKE_U32_FROM_U8(0xA, 0x0, 0x0, 0x0); 520 pNode->node.au32F02_param[3] = RT_MAKE_U32_FROM_U8(0xA, 0x0, 0x0, 0x0); 521 break; 522 /* ADCs */ 523 case 0x7: 524 pNode->node.name = "ADC-0"; 525 pNode->node.au32F02_param[0] = RT_MAKE_U32_FROM_U8(0x23, 0, 0, 0); 526 pNode->node.au32F02_param[1] = RT_MAKE_U32_FROM_U8(0x23, 0, 0, 0); 527 pNode->node.au32F02_param[2] = RT_MAKE_U32_FROM_U8(0x23, 0, 0, 0); 528 pNode->node.au32F02_param[3] = RT_MAKE_U32_FROM_U8(0x23, 0, 0, 0); 529 goto adc_init; 530 break; 531 case 0x8: 532 pNode->node.name = "ADC-1"; 533 pNode->node.au32F02_param[0] = RT_MAKE_U32_FROM_U8(0x24, 0, 0, 0); 534 pNode->node.au32F02_param[1] = RT_MAKE_U32_FROM_U8(0x24, 0, 0, 0); 535 pNode->node.au32F02_param[2] = RT_MAKE_U32_FROM_U8(0x24, 0, 0, 0); 536 pNode->node.au32F02_param[3] = RT_MAKE_U32_FROM_U8(0x24, 0, 0, 0); 537 goto adc_init; 538 break; 539 case 0x9: 540 pNode->node.name = "ADC-2"; 541 pNode->node.au32F02_param[0] = RT_MAKE_U32_FROM_U8(0x22, 0, 0, 0); 542 pNode->node.au32F02_param[1] = RT_MAKE_U32_FROM_U8(0x22, 0, 0, 0); 543 pNode->node.au32F02_param[2] = RT_MAKE_U32_FROM_U8(0x22, 0, 0, 0); 544 pNode->node.au32F02_param[3] = RT_MAKE_U32_FROM_U8(0x22, 0, 0, 0); 545 adc_init: 546 pNode->node.au32F00_param[0xB] = 0x1; 547 pNode->node.au32F00_param[0x9] = 0x10011b; 548 pNode->node.au32F00_param[0xD] = 0x80032e10; 549 pNode->node.au32F00_param[0xE] = 0x1; 550 pNode->node.au32F00_param[0xA] = RT_BIT(17)|RT_BIT(5); 551 pNode->adc.u32A_param = (1<<14)|(0x1<<4) | 0x1; 552 break; 553 /* Ports */ 554 case 0x14: 555 pNode->node.name = "PORT-D"; 556 pNode->port.u32F1c_param = 0x12b4050; 557 pNode->node.au32F00_param[0xC] = RT_BIT(13)|RT_BIT(12)|RT_BIT(11)|RT_BIT(10)|RT_BIT(9)|RT_BIT(8)|RT_BIT(5)|RT_BIT(4)|RT_BIT(3)|RT_BIT(2); 558 goto port_init; 559 break; 560 case 0x15: 561 pNode->node.name = "PORT-A"; 562 pNode->port.u32F1c_param = 0x18b3020; 563 pNode->node.au32F00_param[0xC] = RT_BIT(13)|RT_BIT(12)|RT_BIT(11)|RT_BIT(10)|RT_BIT(9)|RT_BIT(8)|RT_BIT(5)|RT_BIT(4)|RT_BIT(3)|RT_BIT(2); 564 goto port_init; 565 break; 566 case 0x16: 567 pNode->node.name = "PORT-G"; 568 pNode->port.u32F1c_param = 0x400000f0; 569 pNode->node.au32F00_param[0xC] = RT_BIT(4)|RT_BIT(3)|RT_BIT(2); 570 goto port_init; 571 break; 572 case 0x17: 573 pNode->node.name = "PORT-H"; 574 pNode->port.u32F1c_param = 0x400000f0; 575 pNode->node.au32F00_param[0xC] = RT_BIT(4)|RT_BIT(3)|RT_BIT(2); 576 goto port_init; 577 break; 578 case 0x18: 579 pNode->node.name = "PORT-B"; 580 pNode->port.u32F1c_param = 0x90100140; 581 pNode->node.au32F00_param[0xC] = RT_BIT(13)|RT_BIT(12)|RT_BIT(11)|RT_BIT(10)|RT_BIT(9)|RT_BIT(8)|RT_BIT(5)|RT_BIT(4)|RT_BIT(3)|RT_BIT(2); 582 goto port_init; 583 break; 584 case 0x19: 585 pNode->node.name = "PORT-F"; 586 pNode->port.u32F1c_param = 0x90a00110; 587 pNode->node.au32F00_param[0xC] = RT_BIT(13)|RT_BIT(12)|RT_BIT(11)|RT_BIT(10)|RT_BIT(9)|RT_BIT(8)|RT_BIT(5)|RT_BIT(4)|RT_BIT(3)|RT_BIT(2); 588 goto port_init; 589 break; 590 case 0x1A: 591 pNode->node.name = "PORT-C"; 592 pNode->port.u32F1c_param = 0x90100141; 593 pNode->node.au32F00_param[0xC] = RT_BIT(13)|RT_BIT(12)|RT_BIT(11)|RT_BIT(10)|RT_BIT(9)|RT_BIT(8)|RT_BIT(5)|RT_BIT(4)|RT_BIT(3)|RT_BIT(2); 594 goto port_init; 595 break; 596 case 0x1B: 597 pNode->node.name = "PORT-E"; 598 pNode->port.u32F1c_param = 0x400000f0; 599 pNode->node.au32F00_param[0xC] = RT_BIT(13)|RT_BIT(12)|RT_BIT(11)|RT_BIT(10)|RT_BIT(9)|RT_BIT(8)|RT_BIT(5)|RT_BIT(4)|RT_BIT(3)|RT_BIT(2); 600 port_init: 601 pNode->node.au32F00_param[0x9] = 0x40018f; 602 pNode->node.au32F00_param[0xD] = 0x270300; 603 pNode->node.au32F00_param[0xE] = 0x5; 604 /* N = 0~3 */ 605 pNode->node.au32F02_param[0] = RT_MAKE_U32_FROM_U8(0xC, 0xD, 0xE, 0xF); 606 pNode->node.au32F02_param[1] = RT_MAKE_U32_FROM_U8(0xC, 0xD, 0xE, 0xF); 607 pNode->node.au32F02_param[2] = RT_MAKE_U32_FROM_U8(0xC, 0xD, 0xE, 0xF); 608 pNode->node.au32F02_param[3] = RT_MAKE_U32_FROM_U8(0xC, 0xD, 0xE, 0xF); 609 /* N = 4~7 */ 610 pNode->node.au32F02_param[4] = RT_MAKE_U32_FROM_U8(0x26, 0, 0, 0); 611 pNode->node.au32F02_param[5] = RT_MAKE_U32_FROM_U8(0x26, 0, 0, 0); 612 pNode->node.au32F02_param[6] = RT_MAKE_U32_FROM_U8(0x26, 0, 0, 0); 613 pNode->node.au32F02_param[7] = RT_MAKE_U32_FROM_U8(0x26, 0, 0, 0); 614 break; 615 /* ADCVols */ 616 case 0x26: 617 pNode->node.name = "AdcVol-0"; 618 pNode->node.au32F00_param[0x9] = 0x20010f; 619 pNode->node.au32F00_param[0xD] = 0x80000000; 620 pNode->node.au32F00_param[0xE] = 0x2; 621 pNode->node.au32F00_param[0x12] = 0x34040; 622 pNode->node.au32F02_param[0] = RT_MAKE_U32_FROM_U8(0x25, 0xB, 0, 0); 623 pNode->node.au32F02_param[1] = RT_MAKE_U32_FROM_U8(0x25, 0xB, 0, 0); 624 pNode->node.au32F02_param[2] = RT_MAKE_U32_FROM_U8(0x25, 0xB, 0, 0); 625 pNode->node.au32F02_param[3] = RT_MAKE_U32_FROM_U8(0x25, 0xB, 0, 0); 626 break; 627 case 0xF: 628 pNode->node.name = "AdcVol-1"; 629 pNode->node.au32F00_param[0x9] = 0x20010f; 630 pNode->node.au32F00_param[0xE] = 0x2; 631 pNode->node.au32F00_param[0x12] = 0x34040; 632 pNode->node.au32F02_param[0] = RT_MAKE_U32_FROM_U8(0x5, 0xB, 0, 0); 633 pNode->node.au32F02_param[1] = RT_MAKE_U32_FROM_U8(0x5, 0xB, 0, 0); 634 pNode->node.au32F02_param[2] = RT_MAKE_U32_FROM_U8(0x5, 0xB, 0, 0); 635 pNode->node.au32F02_param[3] = RT_MAKE_U32_FROM_U8(0x5, 0xB, 0, 0); 636 break; 637 case 0xE: 638 pNode->node.name = "AdcVol-2"; 639 pNode->node.au32F00_param[0x9] = 0x20010f; 640 pNode->node.au32F00_param[0xE] = 0x2; 641 pNode->node.au32F00_param[0xD] = 0x80000000; 642 pNode->node.au32F00_param[0x12] = 0x34040; 643 pNode->node.au32F02_param[0] = RT_MAKE_U32_FROM_U8(0x4, 0xB, 0, 0); 644 pNode->node.au32F02_param[1] = RT_MAKE_U32_FROM_U8(0x4, 0xB, 0, 0); 645 pNode->node.au32F02_param[2] = RT_MAKE_U32_FROM_U8(0x4, 0xB, 0, 0); 646 pNode->node.au32F02_param[3] = RT_MAKE_U32_FROM_U8(0x4, 0xB, 0, 0); 647 break; 648 case 0xD: 649 pNode->node.name = "AdcVol-3"; 650 pNode->node.au32F00_param[0x9] = 0x20010f; 651 pNode->node.au32F00_param[0xE] = 0x2; 652 pNode->node.au32F00_param[0xD] = 0x80000000; 653 pNode->node.au32F00_param[0x12] = 0x34040; 654 pNode->node.au32F02_param[0] = RT_MAKE_U32_FROM_U8(0x3, 0xB, 0, 0); 655 pNode->node.au32F02_param[1] = RT_MAKE_U32_FROM_U8(0x3, 0xB, 0, 0); 656 pNode->node.au32F02_param[2] = RT_MAKE_U32_FROM_U8(0x3, 0xB, 0, 0); 657 pNode->node.au32F02_param[3] = RT_MAKE_U32_FROM_U8(0x3, 0xB, 0, 0); 658 break; 659 case 0xC: 660 pNode->node.name = "AdcVol-4"; 661 pNode->node.au32F00_param[0x9] = 0x20010f; 662 pNode->node.au32F00_param[0xE] = 0x2; 663 pNode->node.au32F00_param[0xD] = 0x80000000; 664 pNode->node.au32F00_param[0x12] = 0x34040; 665 pNode->node.au32F02_param[0] = RT_MAKE_U32_FROM_U8(0x2, 0xB, 0, 0); 666 pNode->node.au32F02_param[1] = RT_MAKE_U32_FROM_U8(0x2, 0xB, 0, 0); 667 pNode->node.au32F02_param[2] = RT_MAKE_U32_FROM_U8(0x2, 0xB, 0, 0); 668 pNode->node.au32F02_param[3] = RT_MAKE_U32_FROM_U8(0x2, 0xB, 0, 0); 669 break; 670 case 0xB: 671 pNode->node.name = "AdcVol-5"; 672 pNode->node.au32F00_param[0x9] = 0x20010b; 673 //pNode->node.au32F00_param[0xA] = 0x80051f17; 674 pNode->node.au32F00_param[0xD] = 0x80051f17; 675 /* N = 0~3 */ 676 pNode->node.au32F02_param[0] = RT_MAKE_U32_FROM_U8(0x18, 0x19, 0x1A, 0x1B); 677 pNode->node.au32F02_param[1] = RT_MAKE_U32_FROM_U8(0x18, 0x19, 0x1A, 0x1B); 678 pNode->node.au32F02_param[2] = RT_MAKE_U32_FROM_U8(0x18, 0x19, 0x1A, 0x1B); 679 pNode->node.au32F02_param[3] = RT_MAKE_U32_FROM_U8(0x18, 0x19, 0x1A, 0x1B); 680 /* N = 4~7 */ 681 pNode->node.au32F02_param[4] = RT_MAKE_U32_FROM_U8(0x1C, 0x1D, 0x14, 0x15); 682 pNode->node.au32F02_param[5] = RT_MAKE_U32_FROM_U8(0x1C, 0x1D, 0x14, 0x15); 683 pNode->node.au32F02_param[6] = RT_MAKE_U32_FROM_U8(0x1C, 0x1D, 0x14, 0x15); 684 pNode->node.au32F02_param[7] = RT_MAKE_U32_FROM_U8(0x1C, 0x1D, 0x14, 0x15); 685 /* N = 8~11 */ 686 pNode->node.au32F02_param[8] = RT_MAKE_U32_FROM_U8(0x16, 0x17, 0, 0); 687 pNode->node.au32F02_param[9] = RT_MAKE_U32_FROM_U8(0x16, 0x17, 0, 0); 688 pNode->node.au32F02_param[10] = RT_MAKE_U32_FROM_U8(0x16, 0x17, 0, 0); 689 pNode->node.au32F02_param[11] = RT_MAKE_U32_FROM_U8(0x16, 0x17, 0, 0); 690 break; 691 /* AdcMuxs */ 692 case 0x22: 693 pNode->node.name = "AdcMux-0"; 694 pNode->node.au32F00_param[0x9] = 0x20010b; 695 pNode->node.au32F00_param[0xD] = 0x80000000; 696 pNode->node.au32F00_param[0xE] = 0xb; 697 goto adc_mux_init; 698 case 0x23: 699 pNode->node.name = "AdcMux-1"; 700 pNode->node.au32F00_param[0x9] = 0x20010b; 701 pNode->node.au32F00_param[0xD] = 0x80000000; 702 pNode->node.au32F00_param[0xE] = 0xb; 703 goto adc_mux_init; 704 case 0x24: 705 pNode->node.name = "AdcMux-2"; 706 pNode->node.au32F00_param[0x9] = 0x20010b; 707 pNode->node.au32F00_param[0xD] = 0x80000000; 708 pNode->node.au32F00_param[0xE] = 0xb; 709 adc_mux_init: 710 /* N = 0~3 */ 711 pNode->node.au32F02_param[0] = RT_MAKE_U32_FROM_U8(0x18, 0x19, 0x1A, 0x1B); 712 pNode->node.au32F02_param[1] = RT_MAKE_U32_FROM_U8(0x18, 0x19, 0x1A, 0x1B); 713 pNode->node.au32F02_param[2] = RT_MAKE_U32_FROM_U8(0x18, 0x19, 0x1A, 0x1B); 714 pNode->node.au32F02_param[3] = RT_MAKE_U32_FROM_U8(0x18, 0x19, 0x1A, 0x1B); 715 /* N = 4~7 */ 716 pNode->node.au32F02_param[4] = RT_MAKE_U32_FROM_U8(0x1C, 0x1D, 0x14, 0x15); 717 pNode->node.au32F02_param[5] = RT_MAKE_U32_FROM_U8(0x1C, 0x1D, 0x14, 0x15); 718 pNode->node.au32F02_param[6] = RT_MAKE_U32_FROM_U8(0x1C, 0x1D, 0x14, 0x15); 719 pNode->node.au32F02_param[7] = RT_MAKE_U32_FROM_U8(0x1C, 0x1D, 0x14, 0x15); 720 /* N = 8~11 */ 721 pNode->node.au32F02_param[8] = RT_MAKE_U32_FROM_U8(0x16, 0x17, 0xB, 0); 722 pNode->node.au32F02_param[9] = RT_MAKE_U32_FROM_U8(0x16, 0x17, 0xB, 0); 723 pNode->node.au32F02_param[10] = RT_MAKE_U32_FROM_U8(0x16, 0x17, 0xB, 0); 724 pNode->node.au32F02_param[11] = RT_MAKE_U32_FROM_U8(0x16, 0x17, 0xB, 0); 725 break; 726 /* PCBEEP */ 727 case 0x1D: 728 pNode->node.name = "PCBEEP"; 729 pNode->node.au32F00_param[0x9] = 0x400000; 730 pNode->port.u32F1c_param = 0x400000f0; 731 pNode->node.au32F00_param[0xC] = RT_BIT(5); 732 break; 733 /* CD */ 734 case 0x1C: 735 pNode->node.name = "CD"; 736 pNode->node.au32F00_param[0x9] = 0x400001; 737 pNode->port.u32F1c_param = 0x400000f0; 738 pNode->node.au32F00_param[0xC] = RT_BIT(5); 739 break; 740 case 0x21: 741 pNode->node.name = "VolumeKnob"; 742 pNode->node.au32F00_param[0x9] = (0x6 << 20)|RT_BIT(7); 743 break; 744 default: 745 AssertMsgFailed(("Unsupported Node")); 746 } 747 return VINF_SUCCESS; 748 } 749 374 750 375 751 /* generic */ … … 494 870 CODEC_GET_AMP_SIDE(cmd), 495 871 u8Index); 872 else if (codecIsPortNode(pState, CODEC_NID(cmd))) 873 *pResp = AMPLIFIER_REGISTER(pNode->port.B_params, 874 CODEC_GET_AMP_DIRECTION(cmd), 875 CODEC_GET_AMP_SIDE(cmd), 876 u8Index); 877 else if (codecIsAdcNode(pState, CODEC_NID(cmd))) 878 *pResp = AMPLIFIER_REGISTER(pNode->adc.B_params, 879 CODEC_GET_AMP_DIRECTION(cmd), 880 CODEC_GET_AMP_SIDE(cmd), 881 u8Index); 496 882 else{ 497 883 AssertMsgReturn(0, ("access to fields of %x need to be implemented\n", CODEC_NID(cmd)), VINF_SUCCESS); … … 524 910 else if (codecIsPcbeepNode(pState, CODEC_NID(cmd))) 525 911 pAmplifier = &pNode->pcbeep.B_params; 912 else if (codecIsPortNode(pState, CODEC_NID(cmd))) 913 pAmplifier = &pNode->port.B_params; 914 else if (codecIsAdcNode(pState, CODEC_NID(cmd))) 915 pAmplifier = &pNode->adc.B_params; 526 916 Assert(pAmplifier); 527 917 if (pAmplifier) … … 549 939 codecSetRegisterU8(&LIFIER_REGISTER(*pAmplifier, AMPLIFIER_OUT, AMPLIFIER_RIGHT, u8Index), cmd, 0); 550 940 } 551 if (CODEC_NID(cmd) == 2)941 if (CODEC_NID(cmd) == pState->u8DacLineOut) 552 942 codecToAudVolume(pAmplifier, AUD_MIXER_VOLUME); 553 if (CODEC_NID(cmd) == 0x17) /* Microphone */943 if (CODEC_NID(cmd) == pState->u8AdcVolsLineIn) /* Microphone */ 554 944 codecToAudVolume(pAmplifier, AUD_MIXER_LINE_IN); 555 945 } … … 591 981 else if (codecIsDigOutPinNode(pState, CODEC_NID(cmd))) 592 982 *pResp = pState->pNodes[CODEC_NID(cmd)].digout.u32F01_param; 983 else if (codecIsPortNode(pState, CODEC_NID(cmd))) 984 *pResp = pState->pNodes[CODEC_NID(cmd)].port.u32F01_param; 985 else if (codecIsAdcNode(pState, CODEC_NID(cmd))) 986 *pResp = pState->pNodes[CODEC_NID(cmd)].adc.u32F01_param; 593 987 return VINF_SUCCESS; 594 988 } … … 609 1003 else if (codecIsDigOutPinNode(pState, CODEC_NID(cmd))) 610 1004 pu32Reg = &pState->pNodes[CODEC_NID(cmd)].digout.u32F01_param; 1005 else if (codecIsPortNode(pState, CODEC_NID(cmd))) 1006 pu32Reg = &pState->pNodes[CODEC_NID(cmd)].port.u32F01_param; 1007 else if (codecIsAdcNode(pState, CODEC_NID(cmd))) 1008 pu32Reg = &pState->pNodes[CODEC_NID(cmd)].adc.u32F01_param; 611 1009 Assert((pu32Reg)); 612 1010 if (pu32Reg) … … 769 1167 Assert((CODEC_CAD(cmd) == pState->id)); 770 1168 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 771 if (CODEC_NID(cmd) >= pState->cTotalNodes) 772 { 773 Log(("HDAcodec: invalid node address %d\n", CODEC_NID(cmd))); 774 return VINF_SUCCESS; 775 } 776 Assert((cmd & CODEC_VERB_8BIT_DATA) < 16); 777 if ((cmd & CODEC_VERB_8BIT_DATA) >= 16) 1169 *pResp = 0; 1170 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1171 { 1172 Log(("HDAcodec: invalid node address %d\n", CODEC_NID(cmd))); 1173 return VINF_SUCCESS; 1174 } 1175 Assert((cmd & CODEC_VERB_8BIT_DATA) < CODECNODE_F02_PARAM_LENGTH); 1176 if ((cmd & CODEC_VERB_8BIT_DATA) >= CODECNODE_F02_PARAM_LENGTH) 778 1177 { 779 1178 Log(("HDAcodec: access to invalid F02 index %d\n", (cmd & CODEC_VERB_8BIT_DATA))); 780 } 781 *pResp = *(uint32_t *)&pState->pNodes[CODEC_NID(cmd)].node.au8F02_param[cmd & CODEC_VERB_8BIT_DATA]; 1179 return VINF_SUCCESS; 1180 } 1181 *pResp = pState->pNodes[CODEC_NID(cmd)].node.au32F02_param[cmd & CODEC_VERB_8BIT_DATA]; 782 1182 return VINF_SUCCESS; 783 1183 } … … 1187 1587 else if (codecIsCdNode(pState, CODEC_NID(cmd))) 1188 1588 pu32Reg = &pState->pNodes[CODEC_NID(cmd)].cdnode.u32F1c_param; 1189 else if (CODEC_NID(cmd) == 0x1B) 1589 else if ( CODEC_NID(cmd) == 0x1B 1590 && pState->enmCodec == STAC9220_CODEC) 1190 1591 pu32Reg = &pState->pNodes[CODEC_NID(cmd)].reserved.u32F1c_param; 1191 1592 Assert((pu32Reg)); … … 1348 1749 pState->pfnLookup = codecLookup; 1349 1750 pState->enmCodec = enmCodec; 1350 if (enmCodec == STAC9220_CODEC) 1351 { 1352 rc = stac9220Construct(pState); 1353 AssertRC(rc); 1751 switch (enmCodec) 1752 { 1753 case STAC9220_CODEC: 1754 rc = stac9220Construct(pState); 1755 AssertRC(rc); 1756 break; 1757 case ALC885_CODEC: 1758 rc = alc885Construct(pState); 1759 AssertRC(rc); 1760 break; 1761 default: 1762 AssertMsgFailed(("Unsupported Codec")); 1354 1763 } 1355 1764 uint8_t i; -
trunk/src/VBox/Devices/Audio/DevCodec.h
r32804 r32933 36 36 37 37 #define CODECNODE_F0_PARAM_LENGTH 0x14 38 #define CODECNODE_F02_PARAM_LENGTH 16 38 39 typedef struct CODECCOMMONNODE 39 40 { … … 42 43 /* RPM 5.3.6 */ 43 44 uint32_t au32F00_param[CODECNODE_F0_PARAM_LENGTH]; 44 uint 8_t au8F02_param[16];45 uint32_t au32F02_param[CODECNODE_F02_PARAM_LENGTH]; 45 46 } CODECCOMMONNODE, *PCODECCOMMONNODE; 46 47 … … 80 81 81 82 uint32_t u32A_param; 83 uint32_t u32F01_param; 82 84 AMPLIFIER B_params; 83 85 } ADCNODE, *PADCNODE; … … 119 121 uint32_t u32F08_param; 120 122 uint32_t u32F09_param; 121 uint32_t u32F1c_param; 123 uint32_t u32F01_param; 124 uint32_t u32F1c_param; 125 AMPLIFIER B_params; 122 126 } PORTNODE, *PPORTNODE; 123 127 … … 221 225 typedef enum 222 226 { 223 STAC9220_CODEC 227 STAC9220_CODEC, 228 ALC885_CODEC 224 229 } ENMCODEC; 225 230 typedef struct CODECState -
trunk/src/VBox/Devices/Audio/DevIchIntelHDA.cpp
r32820 r32933 1669 1669 PCIDevSetDeviceId (&pThis->dev, 0x30f7); /* HP Pavilion dv4t-1300 */ 1670 1670 #else 1671 #if 1 1671 1672 PCIDevSetVendorId (&pThis->dev, 0x8086); /* 00 ro - intel. */ 1672 1673 PCIDevSetDeviceId (&pThis->dev, 0x2668); /* 02 ro - 82801 / 82801aa(?). */ 1674 #else 1675 PCIDevSetVendorId (&pThis->dev, 0x10de); /* nVidia */ 1676 PCIDevSetDeviceId (&pThis->dev, 0x0028); /* HDA */ 1677 #endif 1673 1678 #endif 1674 1679 PCIDevSetCommand (&pThis->dev, 0x0000); /* 04 rw,ro - pcicmd. */
Note:
See TracChangeset
for help on using the changeset viewer.