From 7f74e3aebdf79fbca4141e6ffcdad39812df9335 Mon Sep 17 00:00:00 2001 From: Bogdan Diaconescu Date: Sun, 17 Apr 2005 22:58:03 +0000 Subject: [PATCH] This is the UDA1380 sound coder-decoder module --- hw/xfree86/i2c/uda1380.c | 168 ++++++++++++++++++++++++++++++++++++++++ hw/xfree86/i2c/uda1380.h | 72 +++++++++++++++++ hw/xfree86/i2c/uda1380_module.c | 26 +++++++ 3 files changed, 266 insertions(+) create mode 100644 hw/xfree86/i2c/uda1380.c create mode 100644 hw/xfree86/i2c/uda1380.h create mode 100644 hw/xfree86/i2c/uda1380_module.c diff --git a/hw/xfree86/i2c/uda1380.c b/hw/xfree86/i2c/uda1380.c new file mode 100644 index 0000000..aa7d62d --- /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 0000000..9254ff6 --- /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 0000000..a821263 --- /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; +} -- 2.7.4