Index: sys/i386/conf/options.i386 diff -u sys/i386/conf/options.i386:1.1.1.1.10.1 sys/i386/conf/options.i386:1.1.1.1.10.2 --- sys/i386/conf/options.i386:1.1.1.1.10.1 Thu Sep 23 06:03:08 1999 +++ sys/i386/conf/options.i386 Fri Sep 24 02:21:14 1999 @@ -137,6 +137,7 @@ # CMI8x38 options CMI_DEBUG opt_cmi.h +CMI_DIRECT_IO opt_cmi.h CMI_DEBUG_VERBOSE opt_cmi.h # Video spigot Index: sys/pci/README.cmi diff -u /dev/null sys/pci/README.cmi:1.1.2.1 --- /dev/null Fri Sep 24 02:58:49 1999 +++ sys/pci/README.cmi Fri Sep 24 02:40:31 1999 @@ -0,0 +1,16 @@ +Copyright (c) Takuya SHIOZAKI , +all rights reserved. + +This is the C-Media CMI8x38 PCI sound chip driver. + +CHANGELOG: + tag:CMI19990924_1 + some fixes: + - add "direct I/O port access" for the "cut-and-try" tests. + - correct SPDIF-out on/off. + NOTE: SPDIF-out can be enabled in the only case of 44.1kHz. + - correct the DMA counting, to prevent the pop noize. + tag:CMI19990923_1 + initial version. + +# end of file Index: sys/pci/cmi.c diff -u sys/pci/cmi.c:1.1.2.2 sys/pci/cmi.c:1.1.2.4 --- sys/pci/cmi.c:1.1.2.2 Thu Sep 23 06:05:38 1999 +++ sys/pci/cmi.c Fri Sep 24 02:21:12 1999 @@ -25,7 +25,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: cmi.c,v 1.1.2.2 1999/09/22 21:05:38 tshiozak Exp $ + * $Id: cmi.c,v 1.1.2.4 1999/09/23 17:21:12 tshiozak Exp $ */ @@ -387,10 +387,14 @@ cmi_codec_partial_write_1(d, CMIREG_FUNCTION_CONTROL1_1, MASKADDR(CMIREG_ADC_RATE), cmi_index_to_divider(index)); - else + else { cmi_codec_partial_write_1(d, CMIREG_FUNCTION_CONTROL1_1, MASKADDR(CMIREG_DAC_RATE), cmi_index_to_divider(index)); + cmi_codec_partial_write_1(d, CMIREG_FUNCTION_CONTROL1_1, + MASKADDR(CMIREG_SPDIF_OUT_EN), + (*ref_speed==44100)?1:0); + } splx(s); } @@ -502,7 +506,7 @@ if ( isread ) { DTOCMI(d)->isinit_in = -1; cmi_codec_write_4(d, CMIREG_CHANNEL1_FRAME1, addr); - cmi_codec_write_2(d, CMIREG_CHANNEL1_FRAME2_0, count -1); + cmi_codec_write_2(d, CMIREG_CHANNEL1_FRAME2_0, count-1); cmi_codec_partial_write_1(d, CMIREG_FUNCTION_CONTROL0_0, MASKADDR(CMIREG_CH1_DIR), 1); cmi_codec_partial_write_1(d, CMIREG_FUNCTION_CONTROL0_2, @@ -510,7 +514,7 @@ } else { DTOCMI(d)->isinit_out = -1; cmi_codec_write_4(d, CMIREG_CHANNEL0_FRAME1, addr); - cmi_codec_write_2(d, CMIREG_CHANNEL0_FRAME2_0, count -1); + cmi_codec_write_2(d, CMIREG_CHANNEL0_FRAME2_0, count-1); cmi_codec_partial_write_1(d, CMIREG_FUNCTION_CONTROL0_0, MASKADDR(CMIREG_CH0_DIR), 0); cmi_codec_partial_write_1(d, CMIREG_FUNCTION_CONTROL0_2, @@ -524,9 +528,9 @@ unsigned int count, int isread) { if ( isread ) { - cmi_codec_write_2(d, CMIREG_CHANNEL1_FRAME2_2, count -1); + cmi_codec_write_2(d, CMIREG_CHANNEL1_FRAME2_2, count-1); } else { - cmi_codec_write_2(d, CMIREG_CHANNEL0_FRAME2_2, count -1); + cmi_codec_write_2(d, CMIREG_CHANNEL0_FRAME2_2, count-1); } } @@ -537,11 +541,9 @@ unsigned int count; if ( isread ) { - count = cmi_codec_read_2(d, CMIREG_CHANNEL1_FRAME2_0); - count &= ~(d->dbuf_in.sample_size-1); + count = cmi_codec_read_2(d, CMIREG_CHANNEL1_FRAME2_0) + 1; } else { - count = cmi_codec_read_2(d, CMIREG_CHANNEL0_FRAME2_0); - count &= ~(d->dbuf_out.sample_size-1); + count = cmi_codec_read_2(d, CMIREG_CHANNEL0_FRAME2_0) + 1; } return count; } @@ -556,9 +558,9 @@ cmi_codec_write_1(d, CMIREG_INTERRUPT_HLD_CLR_2, 0);/* interrupt disable */ cmi_codec_write_1(d, CMIREG_FUNCTION_CONTROL0_2, 0);/* reset channel */ sb16_write(d, SB16_MIXER_RESET, 0); /* reset mixer */ - /* SPDIF enable */ - cmi_codec_partial_write_1(d, CMIREG_FUNCTION_CONTROL1_0, - MASKADDR(CMIREG_SPDIF_ENABLE), 1); + /* SPDIF disable */ + cmi_codec_partial_write_1(d, CMIREG_FUNCTION_CONTROL1_1, + MASKADDR(CMIREG_SPDIF_OUT_EN), 0); d->play_speed = d->rec_speed = DSP_DEFAULT_SPEED; cmi_set_speed(d, FL_WRITE); cmi_set_speed(d, FL_READ); @@ -1037,7 +1039,30 @@ snddev_info *d = &pcm_info[unit]; long s; - CMI_DPRINTF_V((CMI_DEVTAG "%d: ioctl cmd=%ld\n", unit, cmd)); + CMI_DPRINTF_V((CMI_DEVTAG "%d: ioctl cmd=%#x\n", unit, (unsigned)cmd)); + +#ifdef CMI_DIRECT_IO + if ( IOCGROUP(cmd) == 'M' ) { + switch (cmd&0xFF) { + case 128: /* direct input from port */ + { + struct { int port; int val; } *v = (void *)data; + v->val = cmi_codec_read_1(d, v->port); + CMI_DPRINTF(("cmi: direct input (%#x) = %#x\n", + v->port, v->val)); + } + return 0; + case 129: /* direct output to port */ + { + struct { int port; int val; } *v = (void *)data; + CMI_DPRINTF(("cmi: direct input (%#x, %#x)\n", + v->port, v->val)); + cmi_codec_write_1(d, v->port, v->val); + } + return 0; + } + } +#endif if ( (cmd&MIXER_WRITE(0)) == MIXER_WRITE(0) ) return cmi_mixer_ioctl(d, cmd, data, fflag, p); Index: sys/pci/cmi_reg.h diff -u sys/pci/cmi_reg.h:1.1.2.1 sys/pci/cmi_reg.h:1.1.2.4 --- sys/pci/cmi_reg.h:1.1.2.1 Thu Sep 23 01:18:02 1999 +++ sys/pci/cmi_reg.h Fri Sep 24 02:49:27 1999 @@ -25,7 +25,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: cmi_reg.h,v 1.1.2.1 1999/09/22 16:18:02 tshiozak Exp $ + * $Id: cmi_reg.h,v 1.1.2.4 1999/09/23 17:49:27 tshiozak Exp $ */ #ifndef _CMI_REG_H_ @@ -93,9 +93,11 @@ #define CMIREG_FUNCTION_CONTROL1_0 0x04 # define CMIREG_MPU401_ENABLE_MASK 0x04 # define CMIREG_MPU401_ENABLE_ADDR 2 -# define CMIREG_SPDIF_ENABLE_MASK 0x80 -# define CMIREG_SPDIF_ENABLE_ADDR 7 +# define CMIREG_SPDIF_DIR_MASK 0x80 /* ??? */ +# define CMIREG_SPDIF_DIR_ADDR 7 #define CMIREG_FUNCTION_CONTROL1_1 0x05 +# define CMIREG_SPDIF_OUT_EN_MASK 0x01 /* NOTE: force 44.1kHz */ +# define CMIREG_SPDIF_OUT_EN_ADDR 0 # define CMIREG_DAC_RATE_MASK 0x1c # define CMIREG_DAC_RATE_ADDR 2 # define CMIREG_ADC_RATE_MASK 0xe0