Date: Mon, 8 Feb 1999 23:08:18 +0200 (EET) From: Sergey Shkonda <serg@bcs.zp.ua> To: luigi@iet.unipi.it Cc: multimedia@FreeBSD.ORG Subject: CS423[567] speed selection Message-ID: <199902082108.XAA03185@bcs3.bcs.zp.ua>
next in thread | raw e-mail | index | archive | help
I've implemented alternate speed selecttion for CS4236.
This patch allow sample rates in range 5.512 - 50.4 kHz
and different record/play rates can be used.
I've tested it with CS4235 (FreeBSD 2.2.8-R)
--- o/mss.h Wed Jun 10 20:37:01 1998
+++ mss.h Mon Feb 8 21:33:07 1999
@@ -99,6 +99,17 @@
#define I9_CEN 0x02 /* capture enable */
/*
+ * register I23 -- extended register access
+ */
+#define I23_XRAE 0x08 /* eXtended Registers Access Enable */
+#define I23_XA_AMASK 0xf4
+#define I23_REG(r) ( (((r)<<4)&0xf0) | (((r)<16)?0:0x04))
+
+/*
+ * Extended register X11
+ */
+#define X11_IFSE 0x20 /* Independed FS Enable */
+/*
* values used in bd_flags
*/
#define BD_F_MCE_BIT 0x0001
--- o/ad1848.c Mon Feb 8 18:38:59 1999
+++ ad1848.c Mon Feb 8 22:02:59 1999
@@ -78,6 +78,8 @@
static void ad_write(snddev_info *d, int reg, u_char data);
static void ad_write_cnt(snddev_info *d, int reg, u_short data);
static int ad_read(snddev_info *d, int reg);
+static int ax_read(snddev_info *d, int reg);
+static void ax_write(snddev_info *d, int reg, u_char data);
/*
* device descriptors for the boards supported by this module.
@@ -724,6 +726,37 @@
ad_write(d, reg, cnt >> 8 ); /* upper base must be last */
}
+static int
+ax_read(snddev_info *d, int reg)
+{
+ u_long flags;
+ int x;
+
+ flags = spltty();
+ AD_WAIT_INIT(d, 201);
+ x = inb(io_Index_Addr(d)) & ~IA_AMASK ;
+ outb(io_Index_Addr(d), (u_char) (23 & IA_AMASK) | x ) ;
+ outb(io_Indexed_Data(d), (u_char) I23_XRAE | I23_REG(reg) ) ;
+ x = inb(io_Indexed_Data(d));
+ splx(flags);
+ return x;
+}
+
+static void
+ax_write(snddev_info *d, int reg, u_char data)
+{
+ u_long flags;
+
+ int x ;
+ flags = spltty();
+ AD_WAIT_INIT(d, 1002);
+ x = inb(io_Index_Addr(d)) & ~IA_AMASK ;
+ outb(io_Index_Addr(d), (u_char) (23 & IA_AMASK) | x ) ;
+ outb(io_Indexed_Data(d), (u_char) I23_XRAE | I23_REG(reg) ) ;
+ outb(io_Indexed_Data(d), data);
+ splx(flags);
+}
+
static void
wait_for_calibration(snddev_info *d)
{
@@ -976,6 +1009,27 @@
}
}
+static int
+cs4236_rate(int rate, int f)
+{
+ static int speeds [] = {
+ 50400, 48000, 32000, 27420,
+ 16000, 9600, 8000, 6620
+ };
+ int i;
+ int newrate;
+ for (i = 0; i < 8; i++)
+ if (rate == speeds[i])
+ return (f ? speeds[i] : i);
+ i = 1058400 / rate; /* 16.9344 MHz / (16*rate) */
+ if (i < 21) /* too fast */
+ i = 21;
+ if (i > 192) /* too slow */
+ i = 192;
+ newrate = 1058400 / i;
+ return (f ? newrate : i);
+}
+
/*
* mss_speed processes the value in play_speed finding the
* matching one. As a side effect, it returns the value to
@@ -1013,7 +1067,13 @@
if (speeds[i] >0 && abs(arg-speeds[i]) < abs(arg-speeds[sel]) )
sel = i ;
- d->play_speed = d->rec_speed = speeds[sel] ;
+ if ( d->bd_id == MD_CS4236 || d->bd_id == MD_CS4237 )
+ {
+ d->play_speed = cs4236_rate(d->play_speed, 1);
+ d->rec_speed = cs4236_rate(d->rec_speed, 1);
+ }
+ else
+ d->play_speed = d->rec_speed = speeds[sel] ;
return sel ;
}
@@ -1338,8 +1398,12 @@
/*
* set mode2 bit for dual dma op. This bit is not implemented
* on the OPTi931
+ * (set mode3 for CS4236/CS4237)
*/
- ad_write(d, 12, ad_read(d, 12) | 0x40 /* mode 2 on the CS42xx */ );
+ if ( d->bd_id == MD_CS4236 || d->bd_id == MD_CS4237 )
+ ad_write(d, 12, ad_read(d, 12) | 0x60 /* mode 3 on the CS4236 */ );
+ else
+ ad_write(d, 12, ad_read(d, 12) | 0x40 /* mode 2 on the CS42xx */ );
/*
* XXX this should really go into mss-speed...
@@ -1354,6 +1418,18 @@
*/
}
+ /*
+ * XXX set sample rate for 4236/4237
+ */
+ if ( d->bd_id == MD_CS4236 || d->bd_id == MD_CS4237 )
+ {
+ /* Enable IFSE in X11 */
+ ax_write (d, 11, ax_read (d, 11) | X11_IFSE);
+ /* ADC rate */
+ ax_write (d, 12, (u_char) cs4236_rate (d->rec_speed, 0));
+ /* DAC rate */
+ ax_write (d, 13, (u_char) cs4236_rate (d->play_speed, 0));
+ }
ad_write(d, 8, r) ;
if ( FULL_DUPLEX(d) ) {
#if 0
--
Sergey Shkonda <serg@bcs.zp.ua>
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-multimedia" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199902082108.XAA03185>
