DAC Filter controls and hwdep device added.
[aic34-eq] / kernel-2.6.28 / Documentation / sound / alsa / soc / tlv320aic3x.txt
diff --git a/kernel-2.6.28/Documentation/sound/alsa/soc/tlv320aic3x.txt b/kernel-2.6.28/Documentation/sound/alsa/soc/tlv320aic3x.txt
new file mode 100644 (file)
index 0000000..ec748f2
--- /dev/null
@@ -0,0 +1,59 @@
+The TLV320AIC3X is a powerful four channel low power audio codec family.
+More information is available at:
+    http://focus.ti.com/docs/prod/folders/print/tlv320aic34.html
+Datasheet:
+    http://www.ti.com/lit/gpn/tlv320aic34
+
+The codec driver leverages the codecs effects through alsa controls and a 
+hwdep device for controlling the hardware fourth-order IIR filter block.
+
+There's an alsa control, "3D Control - Depth" for depth simulation.
+The rest of the controls are for the IIR filter:
+
+1- A control for setting the bass/treble gain, which sets the filter's
+   coefficients to certain precalculated values.
+2- A control for 'off' / 'on' / 'external control'. 'On' means the 
+   bass/treble gain is used, while 'external control' means the 
+   coefficients have been set through the hwdep device (see below).
+
+
+
+The IIR Filter consists of 2 cascaded biquads. The formula is:
+ /                                \  /                                \
+|    (N0 + 2*N1*z^-1 + N2*z^-2)    ||    (N3 + 2*N4*z^-1 + N5*z^-2)    |
+|  ------------------------------  ||  ------------------------------  |
+ \ (32768 - 2*D1*z^-1 - D2*z^-2)  /  \ (32768 - 2*D4*z^-1 - D5*z^-2)  /
+
+The filter can be controlled through an alsa hwdep device, via 
+libalsa. A short example follows, note that the data struct must be
+passed *EXACTLY* as shown:
+
+#include <stdint.h>
+#include <alsa/hwdep.h>
+
+struct _iirfilter_data {
+    int16_t N0, N1, N2, D1, D2;
+    int16_t N3, N4, N5, D4, D5;
+} iirfilter_data;
+
+/* Initialize */
+snd_hwdep *hwdep;
+
+snd_hwdep_open(&hwdep, "IIR Filter", "w");
+
+/* To write: */
+iirfilter_data = {
+       .N0 = 27619, .N1 = -27034, .N2 = 26461, .D1 = 32131, .D2 = -31506,
+    .N3 = 27619, .N4 = -27034, .N5 = 26461, .D4 = 32131, .D5 = -31506
+};
+
+snd_hwdep_write(hwdep, (void*)iirfilter_data, sizeof(iirfilter_data));
+
+/* To read: */
+snd_hwdep_read(hwdep, (void*)iirfilter_data, sizeof(iirfilter_data));
+
+/* To enable/disable filtering: */
+int arg = 1; /* 1 = enable, 0 = disable */
+snd_hwdep_ioctl(hwdep, 1, &arg);
+
+