sm_sbc.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:25k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * sm_sbc.c  -- soundcard radio modem driver soundblaster hardware driver
  3.  *
  4.  * Copyright (C) 1996  Thomas Sailer (sailer@ife.ee.ethz.ch)
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2 of the License, or
  9.  * (at your option) any later version.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software
  18.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  *
  20.  *  Please note that the GPL allows you to use the driver, NOT the radio.
  21.  *  In order to use the radio, you need a license from the communications
  22.  *  authority of your country.
  23.  *
  24.  */
  25. #include <linux/ptrace.h>
  26. #include <linux/sched.h>
  27. #include <linux/interrupt.h>
  28. #include <asm/io.h>
  29. #include <asm/dma.h>
  30. #include <linux/ioport.h>
  31. #include <linux/soundmodem.h>
  32. #include <linux/delay.h>
  33. #include "sm.h"
  34. #include "smdma.h"
  35. /* --------------------------------------------------------------------- */
  36. /*
  37.  * currently this module is supposed to support both module styles, i.e.
  38.  * the old one present up to about 2.1.9, and the new one functioning
  39.  * starting with 2.1.21. The reason is I have a kit allowing to compile
  40.  * this module also under 2.0.x which was requested by several people.
  41.  * This will go in 2.2
  42.  */
  43. #include <linux/version.h>
  44. #include <asm/uaccess.h>
  45. /* --------------------------------------------------------------------- */
  46. struct sc_state_sbc {
  47. unsigned char revhi, revlo;
  48. unsigned char fmt[2];
  49. unsigned int sr[2];
  50. };
  51. #define SCSTATE ((struct sc_state_sbc *)(&sm->hw))
  52. /* --------------------------------------------------------------------- */
  53. /* 
  54.  * the sbc converter's registers 
  55.  */
  56. #define DSP_RESET(iobase)        (iobase+0x6)
  57. #define DSP_READ_DATA(iobase)    (iobase+0xa)
  58. #define DSP_WRITE_DATA(iobase)   (iobase+0xc)
  59. #define DSP_WRITE_STATUS(iobase) (iobase+0xc)
  60. #define DSP_DATA_AVAIL(iobase)   (iobase+0xe)
  61. #define DSP_MIXER_ADDR(iobase)   (iobase+0x4)
  62. #define DSP_MIXER_DATA(iobase)   (iobase+0x5)
  63. #define DSP_INTACK_16BIT(iobase) (iobase+0xf)
  64. #define SBC_EXTENT               16
  65. /* --------------------------------------------------------------------- */
  66. /*
  67.  * SBC commands
  68.  */
  69. #define SBC_OUTPUT             0x14
  70. #define SBC_INPUT              0x24
  71. #define SBC_BLOCKSIZE          0x48
  72. #define SBC_HI_OUTPUT          0x91 
  73. #define SBC_HI_INPUT           0x99 
  74. #define SBC_LO_OUTPUT_AUTOINIT 0x1c
  75. #define SBC_LO_INPUT_AUTOINIT  0x2c
  76. #define SBC_HI_OUTPUT_AUTOINIT 0x90 
  77. #define SBC_HI_INPUT_AUTOINIT  0x98
  78. #define SBC_IMMED_INT          0xf2
  79. #define SBC_GET_REVISION       0xe1
  80. #define ESS_GET_REVISION       0xe7
  81. #define SBC_SPEAKER_ON         0xd1
  82. #define SBC_SPEAKER_OFF        0xd3
  83. #define SBC_DMA_ON             0xd0
  84. #define SBC_DMA_OFF            0xd4
  85. #define SBC_SAMPLE_RATE        0x40
  86. #define SBC_SAMPLE_RATE_OUT    0x41
  87. #define SBC_SAMPLE_RATE_IN     0x42
  88. #define SBC_MONO_8BIT          0xa0
  89. #define SBC_MONO_16BIT         0xa4
  90. #define SBC_STEREO_8BIT        0xa8
  91. #define SBC_STEREO_16BIT       0xac
  92. #define SBC4_OUT8_AI           0xc6
  93. #define SBC4_IN8_AI            0xce
  94. #define SBC4_MODE_UNS_MONO     0x00
  95. #define SBC4_MODE_SIGN_MONO    0x10
  96. #define SBC4_OUT16_AI          0xb6
  97. #define SBC4_IN16_AI           0xbe
  98. /* --------------------------------------------------------------------- */
  99. static int inline reset_dsp(struct net_device *dev)
  100. {
  101. int i;
  102. outb(1, DSP_RESET(dev->base_addr));
  103. udelay(300);
  104. outb(0, DSP_RESET(dev->base_addr));
  105. for (i = 0; i < 0xffff; i++)
  106. if (inb(DSP_DATA_AVAIL(dev->base_addr)) & 0x80)
  107. if (inb(DSP_READ_DATA(dev->base_addr)) == 0xaa)
  108. return 1;
  109. return 0;
  110. }
  111. /* --------------------------------------------------------------------- */
  112. static void inline write_dsp(struct net_device *dev, unsigned char data)
  113. {
  114. int i;
  115. for (i = 0; i < 0xffff; i++)
  116. if (!(inb(DSP_WRITE_STATUS(dev->base_addr)) & 0x80)) {
  117. outb(data, DSP_WRITE_DATA(dev->base_addr));
  118. return;
  119. }
  120. }
  121. /* --------------------------------------------------------------------- */
  122. static int inline read_dsp(struct net_device *dev, unsigned char *data)
  123. {
  124. int i;
  125. if (!data)
  126. return 0;
  127. for (i = 0; i < 0xffff; i++) 
  128. if (inb(DSP_DATA_AVAIL(dev->base_addr)) & 0x80) {
  129. *data = inb(DSP_READ_DATA(dev->base_addr));
  130. return 1;
  131. }
  132. return 0;
  133. }
  134. /* --------------------------------------------------------------------- */
  135. static int config_resources(struct net_device *dev, struct sm_state *sm, int fdx)
  136. {
  137. unsigned char irqreg = 0, dmareg = 0, realirq, realdma;
  138. unsigned long flags;
  139. switch (dev->irq) {
  140. case 2:
  141. case 9:
  142. irqreg |= 0x01;
  143. break;
  144. case 5:
  145. irqreg |= 0x02;
  146. break;
  147. case 7:
  148. irqreg |= 0x04;
  149. break;
  150. case 10:
  151. irqreg |= 0x08;
  152. break;
  153. default:
  154. return -ENODEV;
  155. }
  156. switch (dev->dma) {
  157. case 0:
  158. dmareg |= 0x01;
  159. break;
  160. case 1:
  161. dmareg |= 0x02;
  162. break;
  163. case 3:
  164. dmareg |= 0x08;
  165. break;
  166. default:
  167. return -ENODEV;
  168. }
  169. if (fdx) {
  170. switch (sm->hdrv.ptt_out.dma2) {
  171. case 5:
  172. dmareg |= 0x20;
  173. break;
  174. case 6:
  175. dmareg |= 0x40;
  176. break;
  177. case 7:
  178. dmareg |= 0x80;
  179. break;
  180. default:
  181. return -ENODEV;
  182. }
  183. }
  184. save_flags(flags);
  185. cli();
  186. outb(0x80, DSP_MIXER_ADDR(dev->base_addr));
  187. outb(irqreg, DSP_MIXER_DATA(dev->base_addr));
  188. realirq = inb(DSP_MIXER_DATA(dev->base_addr));
  189. outb(0x81, DSP_MIXER_ADDR(dev->base_addr));
  190. outb(dmareg, DSP_MIXER_DATA(dev->base_addr));
  191. realdma = inb(DSP_MIXER_DATA(dev->base_addr));
  192. restore_flags(flags);
  193. if ((~realirq) & irqreg || (~realdma) & dmareg) {
  194. printk(KERN_ERR "%s: sbc resource registers cannot be set; PnP device "
  195.        "and IRQ/DMA specified wrongly?n", sm_drvname);
  196. return -EINVAL;
  197. }
  198. return 0;
  199. }
  200. /* --------------------------------------------------------------------- */
  201. static void inline sbc_int_ack_8bit(struct net_device *dev)
  202. {
  203. inb(DSP_DATA_AVAIL(dev->base_addr));
  204. }
  205. /* --------------------------------------------------------------------- */
  206. static void inline sbc_int_ack_16bit(struct net_device *dev)
  207. {
  208. inb(DSP_INTACK_16BIT(dev->base_addr));
  209. }
  210. /* --------------------------------------------------------------------- */
  211. static void setup_dma_dsp(struct net_device *dev, struct sm_state *sm, int send)
  212. {
  213.         unsigned long flags;
  214.         static const unsigned char sbcmode[2][2] = {
  215. { SBC_LO_INPUT_AUTOINIT, SBC_LO_OUTPUT_AUTOINIT }, 
  216. { SBC_HI_INPUT_AUTOINIT, SBC_HI_OUTPUT_AUTOINIT }
  217. };
  218. static const unsigned char sbc4mode[2] = { SBC4_IN8_AI, SBC4_OUT8_AI };
  219. static const unsigned char sbcskr[2] = { SBC_SPEAKER_OFF, SBC_SPEAKER_ON };
  220. unsigned int nsamps;
  221. send = !!send;
  222.         if (!reset_dsp(dev)) {
  223.                 printk(KERN_ERR "%s: sbc: cannot reset sb dspn", sm_drvname);
  224.                 return;
  225.         }
  226.         save_flags(flags);
  227.         cli();
  228.         sbc_int_ack_8bit(dev);
  229.         write_dsp(dev, SBC_SAMPLE_RATE); /* set sampling rate */
  230.         write_dsp(dev, SCSTATE->fmt[send]);
  231.         write_dsp(dev, sbcskr[send]); 
  232. nsamps = dma_setup(sm, send, dev->dma) - 1;
  233.         sbc_int_ack_8bit(dev);
  234. if (SCSTATE->revhi >= 4) {
  235. write_dsp(dev, sbc4mode[send]);
  236. write_dsp(dev, SBC4_MODE_UNS_MONO);
  237. write_dsp(dev, nsamps & 0xff);
  238. write_dsp(dev, nsamps >> 8);
  239. } else {
  240. write_dsp(dev, SBC_BLOCKSIZE);
  241. write_dsp(dev, nsamps & 0xff);
  242. write_dsp(dev, nsamps >> 8);
  243. write_dsp(dev, sbcmode[SCSTATE->fmt[send] >= 180][send]);
  244. /* hispeed mode if sample rate > 13kHz */
  245. }
  246.         restore_flags(flags);
  247. }
  248. /* --------------------------------------------------------------------- */
  249. static void sbc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  250. {
  251. struct net_device *dev = (struct net_device *)dev_id;
  252. struct sm_state *sm = (struct sm_state *)dev->priv;
  253. unsigned int curfrag;
  254. if (!dev || !sm || sm->hdrv.magic != HDLCDRV_MAGIC)
  255. return;
  256. cli();
  257.   sbc_int_ack_8bit(dev);
  258. disable_dma(dev->dma);
  259. clear_dma_ff(dev->dma);
  260. dma_ptr(sm, sm->dma.ptt_cnt > 0, dev->dma, &curfrag);
  261. enable_dma(dev->dma);
  262. sm_int_freq(sm);
  263. sti();
  264. if (sm->dma.ptt_cnt <= 0) {
  265. dma_receive(sm, curfrag);
  266. hdlcdrv_arbitrate(dev, &sm->hdrv);
  267. if (hdlcdrv_ptt(&sm->hdrv)) {
  268. /* starting to transmit */
  269. disable_dma(dev->dma);
  270. hdlcdrv_transmitter(dev, &sm->hdrv); /* prefill HDLC buffer */
  271. dma_start_transmit(sm);
  272. setup_dma_dsp(dev, sm, 1);
  273. dma_transmit(sm);
  274. }
  275. } else if (dma_end_transmit(sm, curfrag)) {
  276. /* stopping transmission */
  277. disable_dma(dev->dma);
  278. sti();
  279. dma_init_receive(sm);
  280. setup_dma_dsp(dev, sm, 0);
  281.         } else
  282. dma_transmit(sm);
  283. sm_output_status(sm);
  284. hdlcdrv_transmitter(dev, &sm->hdrv);
  285. hdlcdrv_receiver(dev, &sm->hdrv);
  286. }
  287. /* --------------------------------------------------------------------- */
  288. static int sbc_open(struct net_device *dev, struct sm_state *sm) 
  289. {
  290. int err;
  291. unsigned int dmasz, u;
  292. if (sizeof(sm->m) < sizeof(struct sc_state_sbc)) {
  293. printk(KERN_ERR "sm sbc: sbc state too big: %d > %dn", 
  294.        sizeof(struct sc_state_sbc), sizeof(sm->m));
  295. return -ENODEV;
  296. }
  297. if (!dev || !sm)
  298. return -ENXIO;
  299. if (dev->base_addr <= 0 || dev->base_addr > 0x1000-SBC_EXTENT || 
  300.     dev->irq < 2 || dev->irq > 15 || dev->dma > 3)
  301. return -ENXIO;
  302. if (check_region(dev->base_addr, SBC_EXTENT))
  303. return -EACCES;
  304. /*
  305.  * check if a card is available
  306.  */
  307. if (!reset_dsp(dev)) {
  308. printk(KERN_ERR "%s: sbc: no card at io address 0x%lxn",
  309.        sm_drvname, dev->base_addr);
  310. return -ENODEV;
  311. }
  312. write_dsp(dev, SBC_GET_REVISION);
  313. if (!read_dsp(dev, &SCSTATE->revhi) || 
  314.     !read_dsp(dev, &SCSTATE->revlo))
  315. return -ENODEV;
  316. printk(KERN_INFO "%s: SoundBlaster DSP revision %d.%dn", sm_drvname, 
  317.        SCSTATE->revhi, SCSTATE->revlo);
  318. if (SCSTATE->revhi < 2) {
  319. printk(KERN_ERR "%s: your card is an antiquity, at least DSP "
  320.        "rev 2.00 requiredn", sm_drvname);
  321. return -ENODEV;
  322. }
  323. if (SCSTATE->revhi < 3 && 
  324.     (SCSTATE->fmt[0] >= 180 || SCSTATE->fmt[1] >= 180)) {
  325. printk(KERN_ERR "%s: sbc io 0x%lx: DSP rev %d.%02d too "
  326.        "old, at least 3.00 requiredn", sm_drvname,
  327.        dev->base_addr, SCSTATE->revhi, SCSTATE->revlo);
  328. return -ENODEV;
  329. }
  330. if (SCSTATE->revhi >= 4 && 
  331.     (err = config_resources(dev, sm, 0))) {
  332. printk(KERN_ERR "%s: invalid IRQ and/or DMA specifiedn", sm_drvname);
  333. return err;
  334. }
  335. /*
  336.  * initialize some variables
  337.  */
  338. dma_init_receive(sm);
  339. dmasz = (NUM_FRAGMENTS + 1) * sm->dma.ifragsz;
  340. u = NUM_FRAGMENTS * sm->dma.ofragsz;
  341. if (u > dmasz)
  342. dmasz = u;
  343. if (!(sm->dma.ibuf = sm->dma.obuf = kmalloc(dmasz, GFP_KERNEL | GFP_DMA)))
  344. return -ENOMEM;
  345. dma_init_transmit(sm);
  346. dma_init_receive(sm);
  347. memset(&sm->m, 0, sizeof(sm->m));
  348. memset(&sm->d, 0, sizeof(sm->d));
  349. if (sm->mode_tx->init)
  350. sm->mode_tx->init(sm);
  351. if (sm->mode_rx->init)
  352. sm->mode_rx->init(sm);
  353. if (request_dma(dev->dma, sm->hwdrv->hw_name)) {
  354. kfree(sm->dma.obuf);
  355. return -EBUSY;
  356. }
  357. if (request_irq(dev->irq, sbc_interrupt, SA_INTERRUPT, 
  358. sm->hwdrv->hw_name, dev)) {
  359. free_dma(dev->dma);
  360. kfree(sm->dma.obuf);
  361. return -EBUSY;
  362. }
  363. request_region(dev->base_addr, SBC_EXTENT, sm->hwdrv->hw_name);
  364. setup_dma_dsp(dev, sm, 0);
  365. return 0;
  366. }
  367. /* --------------------------------------------------------------------- */
  368. static int sbc_close(struct net_device *dev, struct sm_state *sm) 
  369. {
  370. if (!dev || !sm)
  371. return -EINVAL;
  372. /*
  373.  * disable interrupts
  374.  */
  375. disable_dma(dev->dma);
  376. reset_dsp(dev);
  377. free_irq(dev->irq, dev);
  378. free_dma(dev->dma);
  379. release_region(dev->base_addr, SBC_EXTENT);
  380. kfree(sm->dma.obuf);
  381. return 0;
  382. }
  383. /* --------------------------------------------------------------------- */
  384. static int sbc_sethw(struct net_device *dev, struct sm_state *sm, char *mode)
  385. {
  386. char *cp = strchr(mode, '.');
  387. const struct modem_tx_info **mtp = sm_modem_tx_table;
  388. const struct modem_rx_info **mrp;
  389. if (!strcmp(mode, "off")) {
  390. sm->mode_tx = NULL;
  391. sm->mode_rx = NULL;
  392. return 0;
  393. }
  394. if (cp)
  395. *cp++ = '';
  396. else
  397. cp = mode;
  398. for (; *mtp; mtp++) {
  399. if ((*mtp)->loc_storage > sizeof(sm->m)) {
  400. printk(KERN_ERR "%s: insufficient storage for modulator %s (%d)n",
  401.        sm_drvname, (*mtp)->name, (*mtp)->loc_storage);
  402. continue;
  403. }
  404. if (!(*mtp)->name || strcmp((*mtp)->name, mode))
  405. continue;
  406. if ((*mtp)->srate < 5000 || (*mtp)->srate > 44100)
  407. continue;
  408. if (!(*mtp)->modulator_u8)
  409. continue;
  410. for (mrp = sm_modem_rx_table; *mrp; mrp++) {
  411. if ((*mrp)->loc_storage > sizeof(sm->d)) {
  412. printk(KERN_ERR "%s: insufficient storage for demodulator %s (%d)n",
  413.        sm_drvname, (*mrp)->name, (*mrp)->loc_storage);
  414. continue;
  415. }
  416. if (!(*mrp)->demodulator_u8)
  417. continue;
  418. if ((*mrp)->name && !strcmp((*mrp)->name, cp) &&
  419.     (*mrp)->srate >= 5000 && (*mrp)->srate <= 44100) {
  420. sm->mode_tx = *mtp;
  421. sm->mode_rx = *mrp;
  422. SCSTATE->fmt[0] = 256-((1000000L+sm->mode_rx->srate/2)/
  423.  sm->mode_rx->srate);
  424. SCSTATE->fmt[1] = 256-((1000000L+sm->mode_tx->srate/2)/
  425.  sm->mode_tx->srate);
  426. sm->dma.ifragsz = (sm->mode_rx->srate + 50)/100;
  427. sm->dma.ofragsz = (sm->mode_tx->srate + 50)/100;
  428. if (sm->dma.ifragsz < sm->mode_rx->overlap)
  429. sm->dma.ifragsz = sm->mode_rx->overlap;
  430. sm->dma.i16bit = sm->dma.o16bit = 0;
  431. return 0;
  432. }
  433. }
  434. }
  435. return -EINVAL;
  436. }
  437. /* --------------------------------------------------------------------- */
  438. static int sbc_ioctl(struct net_device *dev, struct sm_state *sm, struct ifreq *ifr, 
  439.      struct hdlcdrv_ioctl *hi, int cmd)
  440. {
  441. struct sm_ioctl bi;
  442. unsigned long flags;
  443. int i;
  444. if (cmd != SIOCDEVPRIVATE)
  445. return -ENOIOCTLCMD;
  446. if (hi->cmd == HDLCDRVCTL_MODEMPARMASK)
  447. return HDLCDRV_PARMASK_IOBASE | HDLCDRV_PARMASK_IRQ | 
  448. HDLCDRV_PARMASK_DMA | HDLCDRV_PARMASK_SERIOBASE | 
  449. HDLCDRV_PARMASK_PARIOBASE | HDLCDRV_PARMASK_MIDIIOBASE;
  450. if (copy_from_user(&bi, ifr->ifr_data, sizeof(bi)))
  451. return -EFAULT;
  452. switch (bi.cmd) {
  453. default:
  454. return -ENOIOCTLCMD;
  455. case SMCTL_GETMIXER:
  456. i = 0;
  457. bi.data.mix.sample_rate = sm->mode_rx->srate;
  458. bi.data.mix.bit_rate = sm->hdrv.par.bitrate;
  459. bi.data.mix.mixer_type = SM_MIXER_INVALID;
  460. switch (SCSTATE->revhi) {
  461. case 2:
  462. bi.data.mix.mixer_type = SM_MIXER_CT1335;
  463. break;
  464. case 3:
  465. bi.data.mix.mixer_type = SM_MIXER_CT1345;
  466. break;
  467. case 4:
  468. bi.data.mix.mixer_type = SM_MIXER_CT1745;
  469. break;
  470. }
  471. if (bi.data.mix.mixer_type != SM_MIXER_INVALID &&
  472.     bi.data.mix.reg < 0x80) {
  473. save_flags(flags);
  474. cli();
  475. outb(bi.data.mix.reg, DSP_MIXER_ADDR(dev->base_addr));
  476. bi.data.mix.data = inb(DSP_MIXER_DATA(dev->base_addr));
  477. restore_flags(flags);
  478. i = 1;
  479. }
  480. if (copy_to_user(ifr->ifr_data, &bi, sizeof(bi)))
  481. return -EFAULT;
  482. return i;
  483. case SMCTL_SETMIXER:
  484. if (!capable(CAP_SYS_RAWIO))
  485. return -EACCES;
  486. switch (SCSTATE->revhi) {
  487. case 2:
  488. if (bi.data.mix.mixer_type != SM_MIXER_CT1335)
  489. return -EINVAL;
  490. break;
  491. case 3:
  492. if (bi.data.mix.mixer_type != SM_MIXER_CT1345)
  493. return -EINVAL;
  494. break;
  495. case 4:
  496. if (bi.data.mix.mixer_type != SM_MIXER_CT1745)
  497. return -EINVAL;
  498. break;
  499. default:
  500. return -ENODEV;
  501. }
  502. if (bi.data.mix.reg >= 0x80)
  503. return -EACCES;
  504. save_flags(flags);
  505. cli();
  506. outb(bi.data.mix.reg, DSP_MIXER_ADDR(dev->base_addr));
  507. outb(bi.data.mix.data, DSP_MIXER_DATA(dev->base_addr));
  508. restore_flags(flags);
  509. return 0;
  510. }
  511. if (copy_to_user(ifr->ifr_data, &bi, sizeof(bi)))
  512. return -EFAULT;
  513. return 0;
  514. }
  515. /* --------------------------------------------------------------------- */
  516. const struct hardware_info sm_hw_sbc = {
  517. "sbc", sizeof(struct sc_state_sbc), 
  518. sbc_open, sbc_close, sbc_ioctl, sbc_sethw
  519. };
  520. /* --------------------------------------------------------------------- */
  521. static void setup_dma_fdx_dsp(struct net_device *dev, struct sm_state *sm)
  522. {
  523.         unsigned long flags;
  524. unsigned int isamps, osamps;
  525.         if (!reset_dsp(dev)) {
  526.                 printk(KERN_ERR "%s: sbc: cannot reset sb dspn", sm_drvname);
  527.                 return;
  528.         }
  529.         save_flags(flags);
  530.         cli();
  531.         sbc_int_ack_8bit(dev);
  532.         sbc_int_ack_16bit(dev);
  533. /* should eventually change to set rates individually by SBC_SAMPLE_RATE_{IN/OUT} */
  534. write_dsp(dev, SBC_SAMPLE_RATE_IN);
  535. write_dsp(dev, SCSTATE->sr[0] >> 8);
  536. write_dsp(dev, SCSTATE->sr[0] & 0xff);
  537. write_dsp(dev, SBC_SAMPLE_RATE_OUT);
  538. write_dsp(dev, SCSTATE->sr[1] >> 8);
  539. write_dsp(dev, SCSTATE->sr[1] & 0xff);
  540.         write_dsp(dev, SBC_SPEAKER_ON);
  541. if (sm->dma.o16bit) {
  542. /*
  543.  * DMA channel 1 (8bit) does input (capture),
  544.  * DMA channel 2 (16bit) does output (playback)
  545.  */
  546. isamps = dma_setup(sm, 0, dev->dma) - 1;
  547. osamps = dma_setup(sm, 1, sm->hdrv.ptt_out.dma2) - 1;
  548. sbc_int_ack_8bit(dev);
  549. sbc_int_ack_16bit(dev);
  550. write_dsp(dev, SBC4_IN8_AI);
  551. write_dsp(dev, SBC4_MODE_UNS_MONO);
  552. write_dsp(dev, isamps & 0xff);
  553. write_dsp(dev, isamps >> 8);
  554. write_dsp(dev, SBC4_OUT16_AI);
  555. write_dsp(dev, SBC4_MODE_SIGN_MONO);
  556. write_dsp(dev, osamps & 0xff);
  557. write_dsp(dev, osamps >> 8);
  558. } else {
  559. /*
  560.  * DMA channel 1 (8bit) does output (playback),
  561.  * DMA channel 2 (16bit) does input (capture)
  562.  */
  563. isamps = dma_setup(sm, 0, sm->hdrv.ptt_out.dma2) - 1;
  564. osamps = dma_setup(sm, 1, dev->dma) - 1;
  565. sbc_int_ack_8bit(dev);
  566. sbc_int_ack_16bit(dev);
  567. write_dsp(dev, SBC4_OUT8_AI);
  568. write_dsp(dev, SBC4_MODE_UNS_MONO);
  569. write_dsp(dev, osamps & 0xff);
  570. write_dsp(dev, osamps >> 8);
  571. write_dsp(dev, SBC4_IN16_AI);
  572. write_dsp(dev, SBC4_MODE_SIGN_MONO);
  573. write_dsp(dev, isamps & 0xff);
  574. write_dsp(dev, isamps >> 8);
  575. }
  576. dma_init_receive(sm);
  577. dma_init_transmit(sm);
  578.         restore_flags(flags);
  579. }
  580. /* --------------------------------------------------------------------- */
  581. static void sbcfdx_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  582. {
  583. struct net_device *dev = (struct net_device *)dev_id;
  584. struct sm_state *sm = (struct sm_state *)dev->priv;
  585. unsigned char intsrc, pbint = 0, captint = 0;
  586. unsigned int ocfrag, icfrag;
  587. unsigned long flags;
  588. if (!dev || !sm || sm->hdrv.magic != HDLCDRV_MAGIC)
  589. return;
  590. save_flags(flags);
  591. cli();
  592. outb(0x82, DSP_MIXER_ADDR(dev->base_addr));
  593. intsrc = inb(DSP_MIXER_DATA(dev->base_addr));
  594. if (intsrc & 0x01) {
  595. sbc_int_ack_8bit(dev);
  596. if (sm->dma.o16bit) {
  597. captint = 1;
  598. disable_dma(dev->dma);
  599. clear_dma_ff(dev->dma);
  600. dma_ptr(sm, 0, dev->dma, &icfrag);
  601. enable_dma(dev->dma);
  602. } else {     
  603. pbint = 1;
  604. disable_dma(dev->dma);
  605. clear_dma_ff(dev->dma);
  606. dma_ptr(sm, 1, dev->dma, &ocfrag);
  607. enable_dma(dev->dma);
  608. }
  609. }
  610. if (intsrc & 0x02) {
  611. sbc_int_ack_16bit(dev);
  612. if (sm->dma.o16bit) {
  613. pbint = 1;
  614. disable_dma(sm->hdrv.ptt_out.dma2);
  615. clear_dma_ff(sm->hdrv.ptt_out.dma2);
  616. dma_ptr(sm, 1, sm->hdrv.ptt_out.dma2, &ocfrag);
  617. enable_dma(sm->hdrv.ptt_out.dma2);
  618. } else {
  619. captint = 1;
  620. disable_dma(sm->hdrv.ptt_out.dma2);
  621. clear_dma_ff(sm->hdrv.ptt_out.dma2);
  622. dma_ptr(sm, 0, sm->hdrv.ptt_out.dma2, &icfrag);
  623. enable_dma(sm->hdrv.ptt_out.dma2);
  624. }
  625. }
  626. restore_flags(flags);
  627. sm_int_freq(sm);
  628. sti();
  629. if (pbint) {
  630. if (dma_end_transmit(sm, ocfrag))
  631. dma_clear_transmit(sm);
  632. dma_transmit(sm);
  633. }
  634. if (captint) { 
  635. dma_receive(sm, icfrag);
  636. hdlcdrv_arbitrate(dev, &sm->hdrv);
  637. }
  638. sm_output_status(sm);
  639. hdlcdrv_transmitter(dev, &sm->hdrv);
  640. hdlcdrv_receiver(dev, &sm->hdrv);
  641. }
  642. /* --------------------------------------------------------------------- */
  643. static int sbcfdx_open(struct net_device *dev, struct sm_state *sm) 
  644. {
  645. int err;
  646. if (sizeof(sm->m) < sizeof(struct sc_state_sbc)) {
  647. printk(KERN_ERR "sm sbc: sbc state too big: %d > %dn", 
  648.        sizeof(struct sc_state_sbc), sizeof(sm->m));
  649. return -ENODEV;
  650. }
  651. if (!dev || !sm)
  652. return -ENXIO;
  653. if (dev->base_addr <= 0 || dev->base_addr > 0x1000-SBC_EXTENT || 
  654.     dev->irq < 2 || dev->irq > 15 || dev->dma > 3)
  655. return -ENXIO;
  656. if (check_region(dev->base_addr, SBC_EXTENT))
  657. return -EACCES;
  658. /*
  659.  * check if a card is available
  660.  */
  661. if (!reset_dsp(dev)) {
  662. printk(KERN_ERR "%s: sbc: no card at io address 0x%lxn",
  663.        sm_drvname, dev->base_addr);
  664. return -ENODEV;
  665. }
  666. write_dsp(dev, SBC_GET_REVISION);
  667. if (!read_dsp(dev, &SCSTATE->revhi) || 
  668.     !read_dsp(dev, &SCSTATE->revlo))
  669. return -ENODEV;
  670. printk(KERN_INFO "%s: SoundBlaster DSP revision %d.%dn", sm_drvname, 
  671.        SCSTATE->revhi, SCSTATE->revlo);
  672. if (SCSTATE->revhi < 4) {
  673. printk(KERN_ERR "%s: at least DSP rev 4.00 requiredn", sm_drvname);
  674. return -ENODEV;
  675. }
  676. if ((err = config_resources(dev, sm, 1))) {
  677. printk(KERN_ERR "%s: invalid IRQ and/or DMA specifiedn", sm_drvname);
  678. return err;
  679. }
  680. /*
  681.  * initialize some variables
  682.  */
  683. if (!(sm->dma.ibuf = kmalloc(sm->dma.ifragsz * (NUM_FRAGMENTS+1), GFP_KERNEL | GFP_DMA)))
  684. return -ENOMEM;
  685. if (!(sm->dma.obuf = kmalloc(sm->dma.ofragsz * NUM_FRAGMENTS, GFP_KERNEL | GFP_DMA))) {
  686. kfree(sm->dma.ibuf);
  687. return -ENOMEM;
  688. }
  689. dma_init_transmit(sm);
  690. dma_init_receive(sm);
  691. memset(&sm->m, 0, sizeof(sm->m));
  692. memset(&sm->d, 0, sizeof(sm->d));
  693. if (sm->mode_tx->init)
  694. sm->mode_tx->init(sm);
  695. if (sm->mode_rx->init)
  696. sm->mode_rx->init(sm);
  697. if (request_dma(dev->dma, sm->hwdrv->hw_name)) {
  698. kfree(sm->dma.ibuf);
  699. kfree(sm->dma.obuf);
  700. return -EBUSY;
  701. }
  702. if (request_dma(sm->hdrv.ptt_out.dma2, sm->hwdrv->hw_name)) {
  703. kfree(sm->dma.ibuf);
  704. kfree(sm->dma.obuf);
  705. free_dma(dev->dma);
  706. return -EBUSY;
  707. }
  708. if (request_irq(dev->irq, sbcfdx_interrupt, SA_INTERRUPT, 
  709. sm->hwdrv->hw_name, dev)) {
  710. kfree(sm->dma.ibuf);
  711. kfree(sm->dma.obuf);
  712. free_dma(dev->dma);
  713. free_dma(sm->hdrv.ptt_out.dma2);
  714. return -EBUSY;
  715. }
  716. request_region(dev->base_addr, SBC_EXTENT, sm->hwdrv->hw_name);
  717. setup_dma_fdx_dsp(dev, sm);
  718. return 0;
  719. }
  720. /* --------------------------------------------------------------------- */
  721. static int sbcfdx_close(struct net_device *dev, struct sm_state *sm) 
  722. {
  723. if (!dev || !sm)
  724. return -EINVAL;
  725. /*
  726.  * disable interrupts
  727.  */
  728. disable_dma(dev->dma);
  729. disable_dma(sm->hdrv.ptt_out.dma2);
  730. reset_dsp(dev);
  731. free_irq(dev->irq, dev);
  732. free_dma(dev->dma);
  733. free_dma(sm->hdrv.ptt_out.dma2);
  734. release_region(dev->base_addr, SBC_EXTENT);
  735. kfree(sm->dma.ibuf);
  736. kfree(sm->dma.obuf);
  737. return 0;
  738. }
  739. /* --------------------------------------------------------------------- */
  740. static int sbcfdx_sethw(struct net_device *dev, struct sm_state *sm, char *mode)
  741. {
  742. char *cp = strchr(mode, '.');
  743. const struct modem_tx_info **mtp = sm_modem_tx_table;
  744. const struct modem_rx_info **mrp;
  745. if (!strcmp(mode, "off")) {
  746. sm->mode_tx = NULL;
  747. sm->mode_rx = NULL;
  748. return 0;
  749. }
  750. if (cp)
  751. *cp++ = '';
  752. else
  753. cp = mode;
  754. for (; *mtp; mtp++) {
  755. if ((*mtp)->loc_storage > sizeof(sm->m)) {
  756. printk(KERN_ERR "%s: insufficient storage for modulator %s (%d)n",
  757.        sm_drvname, (*mtp)->name, (*mtp)->loc_storage);
  758. continue;
  759. }
  760. if (!(*mtp)->name || strcmp((*mtp)->name, mode))
  761. continue;
  762. if ((*mtp)->srate < 5000 || (*mtp)->srate > 44100)
  763. continue;
  764. for (mrp = sm_modem_rx_table; *mrp; mrp++) {
  765. if ((*mrp)->loc_storage > sizeof(sm->d)) {
  766. printk(KERN_ERR "%s: insufficient storage for demodulator %s (%d)n",
  767.        sm_drvname, (*mrp)->name, (*mrp)->loc_storage);
  768. continue;
  769. }
  770. if ((*mrp)->name && !strcmp((*mrp)->name, cp) &&
  771.     (*mtp)->srate >= 5000 && (*mtp)->srate <= 44100 &&
  772.     (*mrp)->srate == (*mtp)->srate) {
  773. sm->mode_tx = *mtp;
  774. sm->mode_rx = *mrp;
  775. SCSTATE->sr[0] = sm->mode_rx->srate;
  776. SCSTATE->sr[1] = sm->mode_tx->srate;
  777. sm->dma.ifragsz = (sm->mode_rx->srate + 50)/100;
  778. sm->dma.ofragsz = (sm->mode_tx->srate + 50)/100;
  779. if (sm->dma.ifragsz < sm->mode_rx->overlap)
  780. sm->dma.ifragsz = sm->mode_rx->overlap;
  781. if (sm->mode_rx->demodulator_s16 && sm->mode_tx->modulator_u8) {
  782. sm->dma.i16bit = 1;
  783. sm->dma.o16bit = 0;
  784. sm->dma.ifragsz <<= 1;
  785. } else if (sm->mode_rx->demodulator_u8 && sm->mode_tx->modulator_s16) {
  786. sm->dma.i16bit = 0;
  787. sm->dma.o16bit = 1;
  788. sm->dma.ofragsz <<= 1;
  789. } else {
  790. printk(KERN_INFO "%s: mode %s or %s unusablen", sm_drvname, 
  791.        sm->mode_rx->name, sm->mode_tx->name);
  792. sm->mode_tx = NULL;
  793. sm->mode_rx = NULL;
  794. return -EINVAL;
  795. }
  796. return 0;
  797. }
  798. }
  799. }
  800. return -EINVAL;
  801. }
  802. /* --------------------------------------------------------------------- */
  803. static int sbcfdx_ioctl(struct net_device *dev, struct sm_state *sm, struct ifreq *ifr, 
  804. struct hdlcdrv_ioctl *hi, int cmd)
  805. {
  806. if (cmd != SIOCDEVPRIVATE)
  807. return -ENOIOCTLCMD;
  808. if (hi->cmd == HDLCDRVCTL_MODEMPARMASK)
  809. return HDLCDRV_PARMASK_IOBASE | HDLCDRV_PARMASK_IRQ | 
  810. HDLCDRV_PARMASK_DMA | HDLCDRV_PARMASK_DMA2 | HDLCDRV_PARMASK_SERIOBASE | 
  811. HDLCDRV_PARMASK_PARIOBASE | HDLCDRV_PARMASK_MIDIIOBASE;
  812. return sbc_ioctl(dev, sm, ifr, hi, cmd);
  813. }
  814. /* --------------------------------------------------------------------- */
  815. const struct hardware_info sm_hw_sbcfdx = {
  816. "sbcfdx", sizeof(struct sc_state_sbc), 
  817. sbcfdx_open, sbcfdx_close, sbcfdx_ioctl, sbcfdx_sethw
  818. };
  819. /* --------------------------------------------------------------------- */