Hello, I'm trying to get to work Asus Xonar Essence STX with OSSv4. So far I've got basic playback. Although I can't communicate with DAC. I can't change volume etc. Can someone please have a look?
best regards, Michał
diff -r 08658fe437c2 kernel/drv/oss_cmi878x/.devices --- a/kernel/drv/oss_cmi878x/.devices Sat May 29 07:57:48 2010 +0300 +++ b/kernel/drv/oss_cmi878x/.devices Tue Jun 01 15:47:43 2010 +0200 @@ -3,3 +3,4 @@ oss_cmi878x pci1043,834f Asus Xonar D1 (AV100) oss_cmi878x pci1043,8275 Asus Xonar DX (AV100) oss_cmi878x pci1043,82b7 Asus Xonar D2X (AV200) +oss_cmi878x pci1043,835c Asus Xonar Essence STX (AV100) diff -r 08658fe437c2 kernel/drv/oss_cmi878x/oss_cmi878x.c --- a/kernel/drv/oss_cmi878x/oss_cmi878x.c Sat May 29 07:57:48 2010 +0300 +++ b/kernel/drv/oss_cmi878x/oss_cmi878x.c Tue Jun 01 15:47:43 2010 +0200 @@ -7,6 +7,7 @@ #include <oss_pci.h> #include <uart401.h> #include <ac97.h> +#include "pcm1796.h" #define CMEDIA_VENDOR_ID 0x13F6 #define CMEDIA_CMI8788 0x8788 @@ -94,6 +95,7 @@ #define SUBID_XONAR_D2X 0x82b7 #define SUBID_XONAR_D1 0x834f #define SUBID_XONAR_DX 0x8275 +#define SUBID_XONAR_STX 0x835c #define SUBID_GENERIC 0x0000 @@ -227,6 +229,15 @@ SOUND_MASK_PHONE \ ) +/* Asus Xonar STX */ + +#define GPIO_INPUT_ROUTE (devc->base+0x0100) +#define XONAR_STX_DAC 0x98 +#define GPIO_ST_OUTPUT_ENABLE (devc->base+0x0001) +#define GPIO_ST_HP_REAR (devc->base+0x0002) +#define GPIO_ST_HP (devc->base+0x0080) + + typedef struct cmi8788_portc { int speed, bits, channels; @@ -424,7 +435,7 @@ /* select the codec number to address */ OUTB (devc->osdev, codec_num, TWO_WIRE_ADDR); MUTEX_EXIT_IRQRESTORE (devc->low_mutex, flags); - oss_udelay(100); + oss_udelay(100); return 1; @@ -452,12 +463,12 @@ OUTW(devc->osdev, 0x0100, TWO_WIRE_CTRL); // Power down, enable control mode. - two_wire_write(devc_, codec_, CS4398_MISC_CTRL, + two_wire_write(devc_, codec_, CS4398_MISC_CTRL, CS4398_CPEN | CS4398_POWER_DOWN); // Left justified PCM (DAC and 8788 support I2S, but doesn't work. // Setting it introduces clipping like hell). two_wire_write(devc_, codec_, CS4398_MODE_CTRL, 0); - // That's the DAC default, set anyway. + // That's the DAC default, set anyway. two_wire_write(devc_, codec_, 3, 0x09); // PCM auto-mute. two_wire_write(devc_, codec_, 4, 0x82); @@ -476,16 +487,16 @@ cs4362a_init(void * devc_, int codec_) { cmi8788_devc *devc = devc_; - + // Fast Two-Wire. Reduces the wire ready time. OUTW(devc->osdev, 0x0100, TWO_WIRE_CTRL); - /* Power down and enable control port. */ + /* Power down and enable control port. */ two_wire_write(devc_, codec_, CS4362A_MODE1_CTRL, CS4362A_CPEN | CS4362A_POWER_DOWN); /* Left-justified PCM */ two_wire_write(devc_, codec_, CS4362A_MODE2_CTRL, CS4362A_DIF_LJUST); /* Ramp & Automute, re-set DAC defaults. */ - two_wire_write(devc_, codec_, CS4362A_MODE3_CTRL, 0x84); + two_wire_write(devc_, codec_, CS4362A_MODE3_CTRL, 0x84); /* Filter control, DAC defs. */ two_wire_write(devc_, codec_, CS4362A_FILTER_CTRL, 0); /* Invert control, DAC defs. */ @@ -586,6 +597,14 @@ pcm1796_write (devc, codec_id, 16, mix_scale(left,8)); pcm1796_write (devc, codec_id, 17, mix_scale(right,8)); break; + case SUBID_XONAR_STX: + if (codec_id == 0) + { + two_wire_write(devc, XONAR_STX_DAC, 16, mix_scale(left,8)); + two_wire_write(devc, XONAR_STX_DAC, 17, mix_scale(right,8)); + } + break; + default: /* Assume default AKM DACs */ data[0] = left; @@ -2315,8 +2334,8 @@ /* I2S to 16bit, see below. */ - sDac = 0x010A; - + sDac = 0x010A; + /* Non-generic DAC initialization */ switch(devc->model) { @@ -2324,6 +2343,7 @@ case SUBID_XONAR_DX: case SUBID_XONAR_D2: case SUBID_XONAR_D2X: + case SUBID_XONAR_STX: /* Must set master clock. */ sDac |= XONAR_DX_MCLOCK_256; break; @@ -2461,6 +2481,35 @@ ac97_hwinit(devc); break; + case SUBID_XONAR_STX: + /* setup for 2wire communication mode */ + OUTB(devc->osdev, INB (devc->osdev, FUNCTION) | 0x40, FUNCTION); + + uint16_t gpio = INW(devc->osdev, GPIO_DATA); + /* Speakers */ + gpio &= ~(GPIO_ST_HP | GPIO_ST_HP_REAR); + + /* Headphones */ + //gpio |= GPIO_ST_HP | GPIO_ST_HP_REAR; + + /* Front panel */ + //gpio = (gpio | GPIO_ST_HP) & ~GPIO_ST_HP_REAR; + + OUTW(devc->osdev, gpio, GPIO_CONTROL); + OUTW(devc->osdev, gpio, GPIO_DATA); + + OUTW(devc->osdev, 0x0100, TWO_WIRE_CTRL); + + two_wire_write(devc, XONAR_STX_DAC, 18, PCM1796_DMF_DISABLED | PCM1796_FMT_24_LJUST | PCM1796_ATLD);// | PCM1796_MUTE); + two_wire_write(devc, XONAR_STX_DAC, 16, mix_scale(75,8)); // left default vol + two_wire_write(devc, XONAR_STX_DAC, 17, mix_scale(75,8)); // right default vol + two_wire_write(devc, XONAR_STX_DAC, 19, PCM1796_FLT_SHARP | PCM1796_ATS_1); + two_wire_write(devc, XONAR_STX_DAC, 20, PCM1796_OS_64); + two_wire_write(devc, XONAR_STX_DAC, 21, 0); + + /* initialize the codec 0 */ + ac97_hwinit(devc); + default: /* SPI default for anything else, including the */ OUTB(devc->osdev, (INB (devc->osdev, FUNCTION) & ~0x40) | 0x80, FUNCTION); @@ -2493,7 +2542,7 @@ case SUBID_XONAR_D2X: portc->adc_type = ADEV_I2SADC2; break; - default: + default: portc->adc_type = ADEV_I2SADC1; OUTB (devc->osdev, INB (devc->osdev, REC_ROUTING) | 0x18, REC_ROUTING); break; @@ -2694,6 +2743,9 @@ case SUBID_XONAR_D2X: devc->chip_name = "Asus Xonar D2X (AV200)"; break; + case SUBID_XONAR_STX: + devc->chip_name = "Asus Xonar Essence STX (AV100)"; + break; default: devc->chip_name = "Asus Xonar (unknown)"; sub_id = SUBID_GENERIC; diff -r 08658fe437c2 kernel/drv/oss_cmi878x/pcm1796.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/drv/oss_cmi878x/pcm1796.h Tue Jun 01 15:47:43 2010 +0200 @@ -0,0 +1,58 @@ +#ifndef PCM1796_H_INCLUDED +#define PCM1796_H_INCLUDED + +/* register 16 */ +#define PCM1796_ATL_MASK 0xff +/* register 17 */ +#define PCM1796_ATR_MASK 0xff +/* register 18 */ +#define PCM1796_MUTE 0x01 +#define PCM1796_DME 0x02 +#define PCM1796_DMF_MASK 0x0c +#define PCM1796_DMF_DISABLED 0x00 +#define PCM1796_DMF_48 0x04 +#define PCM1796_DMF_441 0x08 +#define PCM1796_DMF_32 0x0c +#define PCM1796_FMT_MASK 0x70 +#define PCM1796_FMT_16_RJUST 0x00 +#define PCM1796_FMT_20_RJUST 0x10 +#define PCM1796_FMT_24_RJUST 0x20 +#define PCM1796_FMT_24_LJUST 0x30 +#define PCM1796_FMT_16_I2S 0x40 +#define PCM1796_FMT_24_I2S 0x50 +#define PCM1796_ATLD 0x80 +/* register 19 */ +#define PCM1796_INZD 0x01 +#define PCM1796_FLT_MASK 0x02 +#define PCM1796_FLT_SHARP 0x00 +#define PCM1796_FLT_SLOW 0x02 +#define PCM1796_DFMS 0x04 +#define PCM1796_OPE 0x10 +#define PCM1796_ATS_MASK 0x60 +#define PCM1796_ATS_1 0x00 +#define PCM1796_ATS_2 0x20 +#define PCM1796_ATS_4 0x40 +#define PCM1796_ATS_8 0x60 +#define PCM1796_REV 0x80 +/* register 20 */ +#define PCM1796_OS_MASK 0x03 +#define PCM1796_OS_64 0x00 +#define PCM1796_OS_32 0x01 +#define PCM1796_OS_128 0x02 +#define PCM1796_CHSL_MASK 0x04 +#define PCM1796_CHSL_LEFT 0x00 +#define PCM1796_CHSL_RIGHT 0x04 +#define PCM1796_MONO 0x08 +#define PCM1796_DFTH 0x10 +#define PCM1796_DSD 0x20 +#define PCM1796_SRST 0x40 +/* register 21 */ +#define PCM1796_PCMZ 0x01 +#define PCM1796_DZ_MASK 0x06 +/* register 22 */ +#define PCM1796_ZFGL 0x01 +#define PCM1796_ZFGR 0x02 +/* register 23 */ +#define PCM1796_ID_MASK 0x1f + +#endif
_______________________________________________ oss-devel mailing list oss-devel@mailman.opensound.com http://mailman.opensound.com/mailman/listinfo/oss-devel