summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBogdan Diaconescu <b_diaconescu@yahoo.com>2005-04-17 22:58:03 +0000
committerBogdan Diaconescu <b_diaconescu@yahoo.com>2005-04-17 22:58:03 +0000
commit7f74e3aebdf79fbca4141e6ffcdad39812df9335 (patch)
tree53b268a2d421f20f0c45d514a24d9bc576305917
parent7a4e5f4006319e025e3ff561eccc3f1ad6c661a0 (diff)
This is the UDA1380 sound coder-decoder module
-rw-r--r--hw/xfree86/i2c/uda1380.c168
-rw-r--r--hw/xfree86/i2c/uda1380.h72
-rw-r--r--hw/xfree86/i2c/uda1380_module.c26
3 files changed, 266 insertions, 0 deletions
diff --git a/hw/xfree86/i2c/uda1380.c b/hw/xfree86/i2c/uda1380.c
new file mode 100644
index 000000000..aa7d62dc5
--- /dev/null
+++ b/hw/xfree86/i2c/uda1380.c
@@ -0,0 +1,168 @@
+/*************************************************************************************
+ * $Id$
+ *
+ * Created by Bogdan D. bogdand@users.sourceforge.net
+ * License: GPL
+ *
+ * $Log$
+ * Revision 1.1 2005/04/17 22:58:03 bogdand
+ * This is the UDA1380 sound coder-decoder module
+ *
+ *
+ ************************************************************************************/
+
+#include "xf86.h"
+#include "xf86i2c.h"
+#include "uda1380.h"
+#include "i2c_def.h"
+
+UDA1380Ptr Detect_uda1380(I2CBusPtr b, I2CSlaveAddr addr)
+{
+ UDA1380Ptr t;
+ I2CByte a;
+
+ t = xcalloc(1, sizeof(UDA1380Rec));
+ if(t == NULL) return NULL;
+ switch(addr)
+ {
+ case UDA1380_ADDR_1:
+ case UDA1380_ADDR_2:
+ t->d.DevName = "UDA1380 Stereo audion coder-decoder";
+ break;
+ default:
+ t->d.DevName = "Generic UDAxxxx";
+ break;
+ }
+ t->d.SlaveAddr = addr;
+ t->d.pI2CBus = b;
+ t->d.NextDev = NULL;
+ t->d.StartTimeout = b->StartTimeout;
+ t->d.BitTimeout = b->BitTimeout;
+ t->d.AcknTimeout = b->AcknTimeout;
+ t->d.ByteTimeout = b->ByteTimeout;
+
+ if(!I2C_WriteRead(&(t->d), NULL, 0, &a, 1))
+ {
+ xfree(t);
+ return NULL;
+ }
+
+ /* set default parameters */
+ if(!I2CDevInit(&(t->d)))
+ {
+ xfree(t);
+ return NULL;
+ }
+
+ xf86DrvMsg(t->d.pI2CBus->scrnIndex,X_INFO,"UDA1380 stereo coder-decoder detected\n");
+
+ return t;
+}
+
+Bool uda1380_init(UDA1380Ptr t)
+{
+ CARD8 data[3];
+ CARD16 tmp;
+ Bool ret;
+
+ /* Power control */
+ data[0] = 0x02;
+ tmp = (1 << 13) | (1 << 10) | ( 1 << 8) | (1 << 7) | (1 << 6) | (1 << 3) | (1 << 1);
+ data[1] = (CARD8)((tmp >> 8) & 0xff);
+ data[2] = (CARD8)(tmp & 0xff);
+ ret = I2C_WriteRead(&(t->d), data, 3, NULL, 0);
+ if (ret == FALSE)
+ {
+ xf86DrvMsg(t->d.pI2CBus->scrnIndex,X_INFO,"UDA1380 failed to initialize\n");
+ return FALSE;
+ }
+
+ /* Analog mixer (AVC) */
+ data[0] = 0x03;
+ /* the analog mixer is muted initially */
+ data[1] = 0x3f;
+ data[2] = 0x3f;
+ ret = I2C_WriteRead(&(t->d), data, 3, NULL, 0);
+ if (ret == FALSE)
+ {
+ xf86DrvMsg(t->d.pI2CBus->scrnIndex,X_INFO,"UDA1380 failed to initialize\n");
+ return FALSE;
+ }
+
+ xf86DrvMsg(t->d.pI2CBus->scrnIndex,X_INFO,"UDA1380 initialized\n");
+
+ return TRUE;
+}
+
+void uda1380_shutdown(UDA1380Ptr t)
+{
+ CARD8 data[3];
+ Bool ret;
+
+ /* Power control */
+ data[0] = 0x02;
+ data[1] = 0;
+ data[2] = 0;
+ ret = I2C_WriteRead(&(t->d), data, 3, NULL, 0);
+ if (ret == FALSE)
+ xf86DrvMsg(t->d.pI2CBus->scrnIndex,X_INFO,"UDA1380 failed to shutdown\n");
+}
+
+void uda1380_setvolume(UDA1380Ptr t, INT32 value)
+{
+ CARD8 data[3];
+ /*
+ * We have to scale the value ranging from -1000 to 1000 to 0x2c to 0
+ */
+ CARD8 volume = 47 - (CARD8)((value + 1000) * 47 / 2000);
+ Bool ret;
+
+ t->analog_mixer_settings = ((volume << 8) & 0x3f00) | (volume & 0x3f);
+
+ /* Analog mixer (AVC) */
+ data[0] = 0x03;
+ data[1] = volume & 0x3f;
+ data[2] = volume & 0x3f;
+ ret = I2C_WriteRead(&(t->d), data, 3, NULL, 0);
+ if (ret == FALSE)
+ xf86DrvMsg(t->d.pI2CBus->scrnIndex,X_INFO,"UDA1380 failed to set volume\n");
+}
+
+void uda1380_mute(UDA1380Ptr t, Bool mute)
+{
+ CARD8 data[3];
+ Bool ret;
+
+ if (mute == TRUE)
+ {
+ /* Analog mixer (AVC) */
+ data[0] = 0x03;
+ data[1] = 0xff;
+ data[2] = 0xff;
+ ret = I2C_WriteRead(&(t->d), data, 3, NULL, 0);
+ if (ret == FALSE)
+ xf86DrvMsg(t->d.pI2CBus->scrnIndex,X_INFO,"UDA1380 failed to mute\n");
+ }
+ else
+ {
+ /* Analog mixer (AVC) */
+ data[0] = 0x03;
+ data[1] = (CARD8)((t->analog_mixer_settings >> 8) & 0x3f);
+ data[2] = (CARD8)(t->analog_mixer_settings & 0x3f);
+ ret = I2C_WriteRead(&(t->d), data, 3, NULL, 0);
+ if (ret == FALSE)
+ xf86DrvMsg(t->d.pI2CBus->scrnIndex,X_INFO,"UDA1380 failed to unmute\n");
+ }
+}
+
+void uda1380_getstatus(UDA1380Ptr t)
+{
+}
+
+void uda1380_setparameters(UDA1380Ptr t)
+{
+}
+
+void uda1380_dumpstatus(UDA1380Ptr t)
+{
+}
diff --git a/hw/xfree86/i2c/uda1380.h b/hw/xfree86/i2c/uda1380.h
new file mode 100644
index 000000000..9254ff6f9
--- /dev/null
+++ b/hw/xfree86/i2c/uda1380.h
@@ -0,0 +1,72 @@
+/*************************************************************************************
+ * $Id$
+ *
+ * Created by Bogdan D. bogdand@users.sourceforge.net
+ * License: GPL
+ *
+ * $Log$
+ * Revision 1.1 2005/04/17 22:58:03 bogdand
+ * This is the UDA1380 sound coder-decoder module
+ *
+ *
+ ************************************************************************************/
+
+#ifndef __UDA1380_H__
+#define __UDA1380_H__
+
+#include "xf86i2c.h"
+
+typedef struct {
+ I2CDevRec d;
+
+ CARD16 analog_mixer_settings; /* register 0x03 */
+
+ } UDA1380Rec, *UDA1380Ptr;
+
+#define UDA1380_ADDR_1 0x30
+#define UDA1380_ADDR_2 0x34
+
+UDA1380Ptr Detect_uda1380(I2CBusPtr b, I2CSlaveAddr addr);
+Bool uda1380_init(UDA1380Ptr t);
+void uda1380_shutdown(UDA1380Ptr t);
+void uda1380_setvolume(UDA1380Ptr t, INT32);
+void uda1380_mute(UDA1380Ptr t, Bool);
+void uda1380_setparameters(UDA1380Ptr t);
+void uda1380_getstatus(UDA1380Ptr t);
+void uda1380_dumpstatus(UDA1380Ptr t);
+
+#define UDA1380SymbolsList \
+ "Detect_uda1380", \
+ "uda1380_init", \
+ "uda1380_shutdown", \
+ "uda1380_setvolume", \
+ "uda1380_mute", \
+ "uda1380_setparameters", \
+ "uda1380_getstatus", \
+ "uda1380_dumpstatus"
+
+#ifdef XFree86LOADER
+
+#define xf86_Detect_uda1380 ((UDA1380Ptr (*)(I2CBusPtr, I2CSlaveAddr))LoaderSymbol("Detect_uda1380"))
+#define xf86_uda1380_init ((Bool (*)(UDA1380Ptr))LoaderSymbol("uda1380_init"))
+#define xf86_uda1380_shutdown ((void (*)(UDA1380Ptr))LoaderSymbol("uda1380_shutdown"))
+#define xf86_uda1380_setvolume ((void (*)(UDA1380Ptr, CARD16))LoaderSymbol("uda1380_setvolume"))
+#define xf86_uda1380_mute ((void (*)(UDA1380Ptr, Bool))LoaderSymbol("uda1380_mute"))
+#define xf86_uda1380_setparameters ((void (*)(UDA1380Ptr))LoaderSymbol("uda1380_setparameters"))
+#define xf86_uda1380_getstatus ((void (*)(UDA1380Ptr))LoaderSymbol("uda1380_getstatus"))
+#define xf86_uda1380_dumpstatus ((void (*)(UDA1380Ptr))LoaderSymbol("uda1380_dumpstatus"))
+
+#else
+
+#define xf86_Detect_uda1380 Detect_uda1380
+#define xf86_uda1380_init uda1380_init
+#define xf86_uda1380_shutdown uda1380_shutdown
+#define xf86_uda1380_setvolume uda1380_setvolume
+#define xf86_uda1380_mute uda1380_mute
+#define xf86_uda1380_setparameters uda1380_setparameters
+#define xf86_uda1380_getstatus uda1380_getstatus
+#define xf86_uda1380_dumpstatus uda1380_dumpstatus
+
+#endif
+
+#endif
diff --git a/hw/xfree86/i2c/uda1380_module.c b/hw/xfree86/i2c/uda1380_module.c
new file mode 100644
index 000000000..a82126364
--- /dev/null
+++ b/hw/xfree86/i2c/uda1380_module.c
@@ -0,0 +1,26 @@
+
+#include "xf86Module.h"
+
+static MODULESETUPPROTO(uda1380Setup);
+
+
+static XF86ModuleVersionInfo uda1380VersRec =
+{
+ "uda1380",
+ MODULEVENDORSTRING,
+ MODINFOSTRING1,
+ MODINFOSTRING2,
+ XF86_VERSION_CURRENT,
+ 1, 0, 0,
+ ABI_CLASS_VIDEODRV, /* This needs the video driver ABI */
+ ABI_VIDEODRV_VERSION,
+ MOD_CLASS_NONE,
+ {0,0,0,0}
+};
+
+XF86ModuleData uda1380ModuleData = { &uda1380VersRec, uda1380Setup, NULL };
+
+static pointer
+uda1380Setup(pointer module, pointer opts, int *errmaj, int *errmin) {
+ return (pointer)1;
+}