Jump to content

[Driver Programming] C-Media CMI8788 (Xonar DX/D1/D2... family)


47 posts in this topic

Recommended Posts

  • 4 weeks later...
  • 1 month later...

Hello there!

 

It's been a long time since last post from TS.

Could any one tell, how the stuff is going on, if working on it?

Any progress making the driver?

 

Integrated MB audio works good for music and bad for recording.

Anyway, sound on Xonar would be much better.

My sound card is Xonar DX, so I wait for this with patience.

  • 1 month later...
  • 3 weeks later...
  • 3 weeks later...
  • 3 weeks later...

otak .. you've really forgoten us :(

 

No, but I'm the busiest I've ever been... Sorry everyone, I won't continue writing this driver for now.

 

Most people don't write drivers for OSX anymore, that's the big problem about finding someone else.

However, if you find someone, just ping me by PM and I'll give all the resources I have.

  • 1 month later...

No one has this driver, so I sold my Xonar DX.

 

Had to install my old Audigy SB1394 with kX project drivers.

Works good in OS X 10.8.2, but there's no way to use mic or line in wit it.

It's driver settings don't work.

Only MIDI Config works for channel setup.

Analog only output works perfect though. :thumbsup_anim:

  • 2 months later...
  • 5 months later...

For xonar xense support port => http://doc.ubuntu-fr.org/xonar_xense

 Signed-off-by: Ian Dawes <madeallup.gen@gmail.com>

diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c
index 64b9fda..df99ec9 100644
--- a/sound/pci/oxygen/virtuoso.c
+++ b/sound/pci/oxygen/virtuoso.c
@@ -52,6 +52,7 @@ static DEFINE_PCI_DEVICE_TABLE(xonar_ids) = {
     { OXYGEN_PCI_SUBID(0x1043, 0x835d) },
     { OXYGEN_PCI_SUBID(0x1043, 0x835e) },
     { OXYGEN_PCI_SUBID(0x1043, 0x838e) },
+    { OXYGEN_PCI_SUBID(0x1043, 0x8428) },
     { OXYGEN_PCI_SUBID(0x1043, 0x8522) },
     { OXYGEN_PCI_SUBID_BROKEN_EEPROM },
     { }
diff --git a/sound/pci/oxygen/xonar_pcm179x.c
b/sound/pci/oxygen/xonar_pcm179x.c
index c8c7f2c..7f31df8 100644
--- a/sound/pci/oxygen/xonar_pcm179x.c
+++ b/sound/pci/oxygen/xonar_pcm179x.c
@@ -212,6 +212,11 @@
 #define GPIO_ST_MAGIC        0x0040
 #define GPIO_ST_HP        0x0080
 
+#define GPIO_XENSE_OUTPUT_ENABLE (0x0001 | 0x0010 | 0x0020)
+#define GPIO_XENSE_HP_REAR       0x0002
+#define GPIO_XENSE_MAGIC         0x0040
+#define GPIO_XENSE_SPEAKERS      0x0080
+
 #define I2C_DEVICE_PCM1796(i)    (0x98 + ((i) << 1))    /* 10011, ii,
/W=0 */
 #define I2C_DEVICE_CS2000    0x9c            /* 100111, 0, /W=0 */
 
@@ -499,6 +504,52 @@ static void xonar_stx_init(struct oxygen *chip)
     xonar_st_init_common(chip);
 }
 
+static void xonar_xense_init(struct oxygen *chip)
+{
+    struct xonar_pcm179x *data = chip->model_data;
+
+    data->generic.ext_power_reg = OXYGEN_GPI_DATA;
+    data->generic.ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK;
+    data->generic.ext_power_bit = GPI_EXT_POWER;
+    xonar_init_ext_power(chip);
+   
+    data->generic.anti_pop_delay = 100;
+    data->h6 = chip->model.dac_channels_mixer > 2;
+    data->has_cs2000 = 1;
+    data->cs2000_regs[CS2000_FUN_CFG_1] = CS2000_REF_CLK_DIV_1;
+    data->broken_i2c = true;
+
+    oxygen_write16(chip, OXYGEN_I2S_A_FORMAT,
+               OXYGEN_RATE_48000 |
+               OXYGEN_I2S_FORMAT_I2S |
+               OXYGEN_I2S_MCLK(data->h6 ? MCLK_256 : MCLK_512) |
+               OXYGEN_I2S_BITS_16 |
+               OXYGEN_I2S_MASTER |
+               OXYGEN_I2S_BCLK_64);
+
+    xonar_st_init_i2c(chip);
+    cs2000_registers_init(chip);
+   
+    data->generic.output_enable_bit = GPIO_XENSE_OUTPUT_ENABLE;
+    data->dacs = chip->model.dac_channels_mixer / 2;
+    data->hp_gain_offset = 2*-18;
+
+    pcm1796_init(chip);
+
+    oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL,
+              GPIO_INPUT_ROUTE | GPIO_XENSE_HP_REAR |
+              GPIO_XENSE_MAGIC | GPIO_XENSE_SPEAKERS);
+    oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA,
+                GPIO_INPUT_ROUTE | GPIO_XENSE_HP_REAR | GPIO_XENSE_SPEAKERS);
+
+    xonar_init_cs53x1(chip);
+    xonar_enable_output(chip);
+
+    snd_component_add(chip->card, "PCM1792A");
+    snd_component_add(chip->card, "CS5381");
+    snd_component_add(chip->card, "CS2000");
+}
+
 static void xonar_d2_cleanup(struct oxygen *chip)
 {
     xonar_disable_output(chip);
@@ -763,7 +814,6 @@ static int st_output_switch_get(struct snd_kcontrol
*ctl,
     return 0;
 }
 
-
 static int st_output_switch_put(struct snd_kcontrol *ctl,
                 struct snd_ctl_elem_value *value)
 {
@@ -859,6 +909,67 @@ static const struct snd_kcontrol_new st_controls[] = {
     },
 };
 
+static int xense_output_switch_get(struct snd_kcontrol *ctl,
+                struct snd_ctl_elem_value *value)
+{
+    struct oxygen *chip = ctl->private_data;
+    u16 gpio;
+
+    gpio = oxygen_read16(chip, OXYGEN_GPIO_DATA);
+    if (gpio & GPIO_XENSE_SPEAKERS)
+        value->value.enumerated.item[0] = 0;
+    else if (!(gpio & GPIO_XENSE_SPEAKERS) && (gpio & GPIO_XENSE_HP_REAR))
+        value->value.enumerated.item[0] = 1;
+    else
+        value->value.enumerated.item[0] = 2;
+    return 0;
+}
+
+static int xense_output_switch_put(struct snd_kcontrol *ctl,
+                struct snd_ctl_elem_value *value)
+{
+    struct oxygen *chip = ctl->private_data;
+    struct xonar_pcm179x *data = chip->model_data;
+    u16 gpio_old, gpio;
+
+    mutex_lock(&chip->mutex);
+    gpio_old = oxygen_read16(chip, OXYGEN_GPIO_DATA);
+    gpio = gpio_old;
+    switch (value->value.enumerated.item[0]) {
+    case 0:
+        gpio |= GPIO_XENSE_SPEAKERS | GPIO_XENSE_HP_REAR;
+        break;
+    case 1:
+        gpio = (gpio | GPIO_XENSE_HP_REAR) & ~GPIO_XENSE_SPEAKERS;
+        break;
+    case 2:
+        gpio &= ~(GPIO_XENSE_SPEAKERS | GPIO_XENSE_HP_REAR);
+        break;
+    }
+    oxygen_write16(chip, OXYGEN_GPIO_DATA, gpio);
+    data->hp_active = !(gpio & GPIO_XENSE_SPEAKERS);
+    update_pcm1796_volume(chip);
+    mutex_unlock(&chip->mutex);
+    return gpio != gpio_old;
+}
+
+static const struct snd_kcontrol_new xense_controls[] = {
+    {
+        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+        .name = "Analog Output",
+        .info = st_output_switch_info,
+        .get = xense_output_switch_get,
+        .put = xense_output_switch_put,
+    },
+    {
+        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+        .name = "Headphones Impedance Playback Enum",
+        .info = st_hp_volume_offset_info,
+        .get = st_hp_volume_offset_get,
+        .put = st_hp_volume_offset_put,
+    },
+};
+
 static void xonar_line_mic_ac97_switch(struct oxygen *chip,
                        unsigned int reg, unsigned int mute)
 {
@@ -946,6 +1057,23 @@ static int xonar_st_mixer_init(struct oxygen *chip)
     return 0;
 }
 
+static int xonar_xense_mixer_init(struct oxygen *chip)
+{
+    unsigned int i;
+    int err;
+
+    for (i = 0; i < ARRAY_SIZE(xense_controls); ++i) {
+        err = snd_ctl_add(chip->card,
+                  snd_ctl_new1(&xense_controls[i], chip));
+        if (err < 0)
+            return err;
+    }
+    err = add_pcm1796_controls(chip);
+    if (err < 0)
+        return err;
+    return 0;
+}
+
 static void dump_pcm1796_registers(struct oxygen *chip,
                    struct snd_info_buffer *buffer)
 {
@@ -1138,6 +1266,13 @@ int get_xonar_pcm179x_model(struct oxygen *chip,
         chip->model.resume = xonar_stx_resume;
         chip->model.set_dac_params = set_pcm1796_params;
         break;
+    case 0x8428:
+        chip->model = model_xonar_st;
+        chip->model.shortname = "Xonar Xense";
+        chip->model.chip = "AV100";
+        chip->model.init = xonar_xense_init;
+        chip->model.mixer_init = xonar_xense_mixer_init;
+        break;
     default:
         return -EINVAL;
     }
  • 10 months later...
  • 4 weeks later...
  • 7 months later...
  • 3 months later...
  • 2 years later...

bump.



 



now that i have some free time on my hands, i hope to work on this some more.



i *think* it should show up as this:

 

Quote

 


Quote

 

 

 


 



    | | +-o AppleACPIPCI 
    | |   +-o ESI@0 
    | |   +-o IOU2@1 
    | |   | +-o IOPP 
    | |   |   +-o I2PS@0 
    | |   |     +-o IOPP 
    | |   |       +-o PPB2@2 
    | |   |       | +-o IOPP 
    | |   |       |   +-o PXS3@0 
    | |   |       |     +-o IOPP 
    | |   |       |       +-o pci13f6,8788@4 
    | |   |       +-o PPB4@4 
    | |   |         +-o IOPP 







 



 

 

 

 



this *looks* right but i could be wrong. however the card is now powered and this does not conflict with the video card stuff (i don't think the 580 has audio output, but i could be wrong):



  

 

 

 

 

 

Quote

 


Quote

 

 

 


| |   +-o IOU0@3 
    | |   | +-o IOPP 
    | |   |   +-o PXS1@0 
    | |   |   | +-o NVDAHal 
    | |   |   | +-o NVDAgl 
    | |   |   | +-o NVDA,Display-A@0 
    | |   |   | | +-o NVDA 
    | |   |   | |   +-o AppleMCCSControlModule 
    | |   |   | |   | +-o AppleMCCSParameterHandler 
    | |   |   | |   +-o AppleUpstreamUserClientDriver 
    | |   |   | |   +-o AGPM 
    | |   |   | |   | +-o gpu-control 
    | |   |   | |   |   +-o IOHWControl 
    | |   |   | |   +-o IOFramebufferI2CInterface 
    | |   |   | |   +-o display0 
    | |   |   | |   | +-o AppleDisplay 
    | |   |   | |   +-o IOFramebufferUserClient 
    | |   |   | |   +-o IOFramebufferSharedUserClient 
    | |   |   | +-o nvAccelerator 
    | |   |   | | +-o nv2DContext 
    | |   |   | | +-o nv2DContext 
    | |   |   | | +-o nvDevice 
    | |   |   | | +-o nvSharedUserClient 
    | |   |   | | +-o nvShareGroupContext 
    | |   |   | | +-o nvFermiGLContext 
    | |   |   | | +-o nvSurface 
    | |   |   | | +-o nvSurface 
    | |   |   | | +-o nvDevice 
    | |   |   | | +-o nvSharedUserClient 
    | |   |   | | +-o nvDevice 
    | |   |   | | +-o nvSharedUserClient 
    | |   |   | | +-o nvShareGroupContext 
    | |   |   | | +-o nvFermiGLContext 
    | |   |   | | +-o nvSurface 
    | |   |   | | +-o nvDevice 
    | |   |   | | +-o nvSharedUserClient 
    | |   |   | | +-o nvShareGroupContext 
    | |   |   | | +-o nvFermiGLContext 
    | |   |   | | +-o nvSurface 
    | |   |   | | +-o nvSurface 
    | |   |   | | +-o nvSurface 
    | |   |   | | +-o nvSurface 
    | |   |   | | +-o nvSurface 
    | |   |   | | +-o nvSurface 
    | |   |   | | +-o nvSurface 
    | |   |   | | +-o nvSurface 
    | |   |   | | +-o nvSurface 
    | |   |   | | +-o nvSurface 
    | |   |   | | +-o nvSurface 
    | |   |   | | +-o nvSurface 
    | |   |   | | +-o nvSurface 
    | |   |   | | +-o nvSurface 
    | |   |   | | +-o nvSurface 
    | |   |   | | +-o nvDevice 
    | |   |   | | +-o nvSharedUserClient 
    | |   |   | | +-o nvShareGroupContext 
    | |   |   | | +-o nvFermiGLContext 
    | |   |   | | +-o nvShareGroupContext 
    | |   |   | | +-o nvFermiGLContext 
    | |   |   | | +-o nvShareGroupContext 
    | |   |   | | +-o nvFermiGLContext 
    | |   |   | +-o NVDA,Display-B@1 
    | |   |   | | +-o NVDA 
    | |   |   | |   +-o AppleMCCSControlModule 
    | |   |   | |   | +-o AppleMCCSParameterHandler 
    | |   |   | |   +-o AppleUpstreamUserClientDriver 
    | |   |   | |   +-o IOFramebufferI2CInterface 
    | |   |   | |   +-o IOFramebufferUserClient 
    | |   |   | +-o NVDC 
    | |   |   | | +-o AppleGraphicsDeviceControlClient 
    | |   |   | +-o NVDAinitgl 
    | |   |   +-o PXS1@0,1 

 

 

 


 



it seems to me the xonar hdav1.3 is wrapping the PCI interface to PCI-E, which is not a surprise since the bandwidth requirements are typically within PCI spec.



again i could be wrong, but given the 8788 PCI and PXS1@0,1's IDs being consecutive (0x1000001f3 and 0x1000001f4, respectively), i think detection is right.



hopefully i can contribute something useful here... exciting area given that IOKit really has not been touched at the level necessary to contribute a proper CMI8788 driver.

progress is here

 

 

Edited by Broly
linking github for interested parties.
  • 2 years later...
  • 1 month later...
  • 2 months later...
On 4/14/2020 at 9:32 PM, Broly said:

i've actually made quite a bit of progress, see below.

 

however i still have to get the streams, mixers, and volume controls setup.

 

I have created a pull request in your github repo, please check it out

Edited by ITzTravelInTime
×
×
  • Create New...