Index: rtems/c/src/lib/libbsp/lm32/shared/milkymist_ac97/ac97.c =================================================================== --- rtems.orig/c/src/lib/libbsp/lm32/shared/milkymist_ac97/ac97.c 2012-05-14 12:34:47.143554000 +0800 +++ rtems/c/src/lib/libbsp/lm32/shared/milkymist_ac97/ac97.c 2012-05-14 12:35:23.753240001 +0800 @@ -314,6 +314,7 @@ unsigned int chan, int mono) { unsigned int *val = (unsigned int *)buf; + int mic_boost; int codec; int left, right; @@ -326,12 +327,14 @@ return RTEMS_SUCCESSFUL; } if (mono) { - right = left = 100-(((codec & 0x1f) + 1)*100)/32; + left = 100-(((codec & 0x1f) + 1)*100)/32; + mic_boost = (codec & (1 << 6)) >> 6; + *val = left | mic_boost << 8; } else { right = 100-(((codec & 0x1f) + 1)*100)/32; left = 100-((((codec & 0x1f00) >> 8) + 1)*100)/32; + *val = left | (right << 8); } - *val = left | (right << 8); return RTEMS_SUCCESSFUL; } @@ -339,21 +342,23 @@ unsigned int chan, int mono) { unsigned int *val = (unsigned int *)buf; + int mic_boost; int left, right; int codec; rtems_status_code sc; left = *val & 0xff; left = (left*32)/100 - 1; - if(left < 0) + if (left < 0) left = 0; - if (mono) + if (mono) { + mic_boost = *val >> 8; right = 31; - else { + } else { right = (*val >> 8) & 0xff; right = (right*32)/100 - 1; - if(right < 0) + if (right < 0) right = 0; } @@ -363,6 +368,13 @@ else codec = (31-left) | ((31-right) << 8); + if (mono) { + if (mic_boost) + codec |= (1 << 6); + else + codec &= ~(1 << 6); + } + if (!write_cr(chan, codec)) sc = RTEMS_UNSATISFIED; else