VirtualBox

Changeset 32933 in vbox for trunk/src/VBox/Devices/Audio


Ignore:
Timestamp:
Oct 6, 2010 8:55:41 AM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
66419
Message:

Audio/HDA: alc885 codec is introduced(workable with Linux guest, recognized by Mac guest), not configurable (disabled).

F02 verb handling is fixed.

Location:
trunk/src/VBox/Devices/Audio
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Audio/DevCodec.cpp

    r32805 r32933  
    174174        case 6:
    175175            pNode->adc.node.name = "ADC0";
    176             pNode->node.au8F02_param[0] = 0x17;
     176            pNode->node.au32F02_param[0] = 0x17;
    177177            goto adc_init;
    178178        case 7:
    179179            pNode->adc.node.name = "ADC1";
    180             pNode->node.au8F02_param[0] = 0x18;
     180            pNode->node.au32F02_param[0] = 0x18;
    181181        adc_init:
    182182            pNode->adc.u32A_param = RT_BIT(14)|(0x1 << 3)|0x1; /* 441000Hz/16bit/2ch */
     
    203203            pNode->node.au32F00_param[0xA] = RT_BIT(17)|RT_BIT(5);
    204204            pNode->node.au32F00_param[0xE] = RT_BIT(0);
    205             pNode->node.au8F02_param[0] = 0x11;
     205            pNode->node.au32F02_param[0] = 0x11;
    206206            pNode->spdifin.node.au32F00_param[0xB] = RT_BIT(2)|RT_BIT(0);
    207207            pNode->spdifin.u32F06_param = 0;
     
    211211            pNode->node.name = "PortA";
    212212            pNode->node.au32F00_param[0xC] = 0x173f;
    213             *(uint32_t *)pNode->node.au8F02_param = 0x2;
     213            pNode->node.au32F02_param[0] = 0x2;
    214214            pNode->port.u32F07_param = RT_BIT(6);
    215215            pNode->port.u32F08_param = 0;
     
    221221            pNode->node.name = "PortB";
    222222            pNode->node.au32F00_param[0xC] = 0x1737;
    223             *(uint32_t *)pNode->node.au8F02_param = 0x4;
     223            pNode->node.au32F02_param[0] = 0x4;
    224224            pNode->port.u32F09_param = 0;
    225225            pNode->port.u32F07_param = RT_BIT(5);
     
    229229        case 0xC:
    230230            pNode->node.name = "PortC";
    231             *(uint32_t *)pNode->node.au8F02_param = 0x3;
     231            pNode->node.au32F02_param[0] = 0x3;
    232232            pNode->node.au32F00_param[0xC] = 0x1737;
    233233            pNode->port.u32F09_param = 0;
     
    241241            pNode->port.u32F09_param = 0;
    242242            pNode->port.u32F07_param = RT_BIT(6);
    243             *(uint32_t *)pNode->node.au8F02_param = 0x2;
     243            pNode->node.au32F02_param[0] = 0x2;
    244244            if (!pState->fInReset)
    245245                pNode->port.u32F1c_param = 0x01013040;  /* Line Out */
     
    268268            if (!pState->fInReset)
    269269                pNode->port.u32F1c_param = RT_MAKE_U32_FROM_U8(0x12, 0x60, 0x11, 0x01);
    270             pNode->node.au8F02_param[0] = 0x5;
     270            pNode->node.au32F02_param[0] = 0x5;
    271271            pNode->port.u32F09_param = 0;
    272272        break;
     
    278278            pNode->digout.u32F01_param = 0;
    279279            /* 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);
    281281            pNode->digout.u32F07_param = 0;
    282282            if (!pState->fInReset)
     
    308308            /* STAC 9220 v10 6.21-22.{4,5} both(left and right) out amplefiers inited with 0*/
    309309            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);
    312312        break;
    313313        case 0x14:
     
    331331            pNode->node.au32F00_param[0x13] = RT_BIT(7)| 0x7F;
    332332            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);
    334334            pNode->volumeKnob.u32F08_param = 0;
    335335            pNode->volumeKnob.u32F0f_param = 0x7f;
     
    337337        case 0x17:
    338338            pNode->node.name = "ADC0Vol";
    339             *(uint32_t *)pNode->node.au8F02_param = 0x12;
     339            pNode->node.au32F02_param[0] = 0x12;
    340340            goto adcvol_init;
    341341        case 0x18:
    342342            pNode->node.name = "ADC1Vol";
    343             *(uint32_t *)pNode->node.au8F02_param = 0x13;
     343            pNode->node.au32F02_param[0] = 0x13;
    344344        adcvol_init:
    345345            memset(pNode->adcvol.B_params, 0, AMPLIFIER_SIZE);
     
    363363            pNode->node.au32F00_param[0x9] = (0x4 << 20)|RT_BIT(9)|RT_BIT(8)|RT_BIT(0);
    364364            pNode->node.au32F00_param[0xE] = 0x1;
    365             pNode->node.au8F02_param[0] = 0x1a;
     365            pNode->node.au32F02_param[0] = 0x1a;
    366366            pNode->reserved.u32F07_param = 0;
    367367            pNode->reserved.u32F1c_param = 0x400000fb; /* dumped from real stac9220 chip */
     
    372372    return VINF_SUCCESS;
    373373}
     374
     375/* ALC885 */
     376const static uint8_t au8Alc889aPorts[] = { 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0};
     377const static uint8_t au8Alc889aDacs[] = { 0x2, 0x3, 0x4, 0x5, 0x25, 0};
     378const static uint8_t au8Alc889aAdcs[] = { 0x7, 0x8, 0x9, 0};
     379const static uint8_t au8Alc889aSpdifOuts[] = { 0x6, 0 };
     380const static uint8_t au8Alc889aSpdifIns[] = { 0xA, 0 };
     381const static uint8_t au8Alc889aDigOutPins[] = { 0x1E, 0 };
     382const static uint8_t au8Alc889aDigInPins[] = { 0x1F, 0 };
     383const static uint8_t au8Alc889aAdcVols[] = { 0xE, 0xF, 0xD, 0xC, 0x26, 0xB, 0};
     384const static uint8_t au8Alc889aAdcMuxs[] = { 0x22, 0x23, 0x24, 0};
     385const static uint8_t au8Alc889aPcbeeps[] = { 0x1D, 0 };
     386const static uint8_t au8Alc889aCds[] = { 0x1C, 0 };
     387const static uint8_t au8Alc889aVolKnobs[] = { 0x21, 0 };
     388const static uint8_t au8Alc889aReserveds[] = { 0x10, 0x11, 0x12, 0x13, 0 };
     389
     390
     391static int alc885ResetNode(struct CODECState *pState, uint8_t nodenum, PCODECNODE pNode);
     392
     393static 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
     421static 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
    374750
    375751/* generic */
     
    494870                            CODEC_GET_AMP_SIDE(cmd),
    495871                            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);
    496882    else{
    497883        AssertMsgReturn(0, ("access to fields of %x need to be implemented\n", CODEC_NID(cmd)), VINF_SUCCESS);
     
    524910    else if (codecIsPcbeepNode(pState, CODEC_NID(cmd)))
    525911        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;
    526916    Assert(pAmplifier);
    527917    if (pAmplifier)
     
    549939                codecSetRegisterU8(&AMPLIFIER_REGISTER(*pAmplifier, AMPLIFIER_OUT, AMPLIFIER_RIGHT, u8Index), cmd, 0);
    550940        }
    551         if (CODEC_NID(cmd) == 2)
     941        if (CODEC_NID(cmd) == pState->u8DacLineOut)
    552942            codecToAudVolume(pAmplifier, AUD_MIXER_VOLUME);
    553         if (CODEC_NID(cmd) == 0x17) /* Microphone */
     943        if (CODEC_NID(cmd) == pState->u8AdcVolsLineIn) /* Microphone */
    554944            codecToAudVolume(pAmplifier, AUD_MIXER_LINE_IN);
    555945    }
     
    591981    else if (codecIsDigOutPinNode(pState, CODEC_NID(cmd)))
    592982        *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;
    593987    return VINF_SUCCESS;
    594988}
     
    6091003    else if (codecIsDigOutPinNode(pState, CODEC_NID(cmd)))
    6101004        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;
    6111009    Assert((pu32Reg));
    6121010    if (pu32Reg)
     
    7691167    Assert((CODEC_CAD(cmd) == pState->id));
    7701168    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)
    7781177    {
    7791178        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];
    7821182    return VINF_SUCCESS;
    7831183}
     
    11871587    else if (codecIsCdNode(pState, CODEC_NID(cmd)))
    11881588        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)
    11901591        pu32Reg = &pState->pNodes[CODEC_NID(cmd)].reserved.u32F1c_param;
    11911592    Assert((pu32Reg));
     
    13481749    pState->pfnLookup = codecLookup;
    13491750    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"));
    13541763    }
    13551764    uint8_t i;
  • trunk/src/VBox/Devices/Audio/DevCodec.h

    r32804 r32933  
    3636
    3737#define CODECNODE_F0_PARAM_LENGTH 0x14
     38#define CODECNODE_F02_PARAM_LENGTH 16
    3839typedef struct CODECCOMMONNODE
    3940{
     
    4243    /* RPM 5.3.6 */
    4344    uint32_t au32F00_param[CODECNODE_F0_PARAM_LENGTH];
    44     uint8_t    au8F02_param[16];
     45    uint32_t au32F02_param[CODECNODE_F02_PARAM_LENGTH];
    4546} CODECCOMMONNODE, *PCODECCOMMONNODE;
    4647
     
    8081
    8182    uint32_t    u32A_param;
     83    uint32_t    u32F01_param;
    8284    AMPLIFIER   B_params;
    8385} ADCNODE, *PADCNODE;
     
    119121    uint32_t u32F08_param;
    120122    uint32_t u32F09_param;
    121     uint32_t u32F1c_param;
     123    uint32_t u32F01_param;
     124    uint32_t u32F1c_param;
     125    AMPLIFIER   B_params;
    122126} PORTNODE, *PPORTNODE;
    123127
     
    221225typedef enum
    222226{
    223     STAC9220_CODEC
     227    STAC9220_CODEC,
     228    ALC885_CODEC
    224229} ENMCODEC;
    225230typedef struct CODECState
  • trunk/src/VBox/Devices/Audio/DevIchIntelHDA.cpp

    r32820 r32933  
    16691669    PCIDevSetDeviceId           (&pThis->dev, 0x30f7); /* HP Pavilion dv4t-1300 */
    16701670#else
     1671#if 1
    16711672    PCIDevSetVendorId           (&pThis->dev, 0x8086); /* 00 ro - intel. */
    16721673    PCIDevSetDeviceId           (&pThis->dev, 0x2668); /* 02 ro - 82801 / 82801aa(?). */
     1674#else
     1675    PCIDevSetVendorId           (&pThis->dev, 0x10de); /* nVidia */
     1676    PCIDevSetDeviceId           (&pThis->dev, 0x0028); /* HDA */
     1677#endif
    16731678#endif
    16741679    PCIDevSetCommand            (&pThis->dev, 0x0000); /* 04 rw,ro - pcicmd. */
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette