📄 ixj.c
字号:
} if (j->flags.ringback) { ixj_ringback(j); if (j->dsp.low == 0x20) { clear_bit(board, &j->busyflags); ixj_add_timer(j); return; } } if (!j->tone_state) { ixj_cpt_stop(j); } } } if (!(j->tone_state && j->dsp.low == 0x20)) { if (IsRxReady(j)) { ixj_read_frame(j); } if (IsTxReady(j)) { ixj_write_frame(j); } } if (j->flags.cringing) { if (j->hookstate & 1) { j->flags.cringing = 0; ixj_ring_off(j); } else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) { switch(j->cadence_f[5].state) { case 0: j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000)); if (time_before(jiffies, j->cadence_f[5].on1dot)) { if(ixjdebug & 0x0004) { printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); } ixj_ring_on(j); } j->cadence_f[5].state = 1; break; case 1: if (time_after(jiffies, j->cadence_f[5].on1dot)) { j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000)); if(ixjdebug & 0x0004) { printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); } ixj_ring_off(j); j->cadence_f[5].state = 2; } break; case 2: if (time_after(jiffies, j->cadence_f[5].off1dot)) { if(ixjdebug & 0x0004) { printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); } ixj_ring_on(j); if (j->cadence_f[5].on2) { j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000)); j->cadence_f[5].state = 3; } else { j->cadence_f[5].state = 7; } } break; case 3: if (time_after(jiffies, j->cadence_f[5].on2dot)) { if(ixjdebug & 0x0004) { printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); } ixj_ring_off(j); if (j->cadence_f[5].off2) { j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000)); j->cadence_f[5].state = 4; } else { j->cadence_f[5].state = 7; } } break; case 4: if (time_after(jiffies, j->cadence_f[5].off2dot)) { if(ixjdebug & 0x0004) { printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); } ixj_ring_on(j); if (j->cadence_f[5].on3) { j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000)); j->cadence_f[5].state = 5; } else { j->cadence_f[5].state = 7; } } break; case 5: if (time_after(jiffies, j->cadence_f[5].on3dot)) { if(ixjdebug & 0x0004) { printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); } ixj_ring_off(j); if (j->cadence_f[5].off3) { j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000)); j->cadence_f[5].state = 6; } else { j->cadence_f[5].state = 7; } } break; case 6: if (time_after(jiffies, j->cadence_f[5].off3dot)) { if(ixjdebug & 0x0004) { printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); } j->cadence_f[5].state = 7; } break; case 7: if(ixjdebug & 0x0004) { printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); } j->flags.cidring = 1; j->cadence_f[5].state = 0; break; } if (j->flags.cidring && !j->flags.cidsent) { j->flags.cidsent = 1; if(j->fskdcnt) { SLIC_SetState(PLD_SLIC_STATE_OHT, j); ixj_pre_cid(j); } j->flags.cidring = 0; } clear_bit(board, &j->busyflags); ixj_add_timer(j); return; } else { if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) { if (j->flags.cidring && !j->flags.cidsent) { j->flags.cidsent = 1; if(j->fskdcnt) { SLIC_SetState(PLD_SLIC_STATE_OHT, j); ixj_pre_cid(j); } j->flags.cidring = 0; } j->ring_cadence_t--; if (j->ring_cadence_t == -1) j->ring_cadence_t = 15; j->ring_cadence_jif = jiffies; if (j->ring_cadence & 1 << j->ring_cadence_t) { if(j->flags.cidsent && j->cadence_f[5].en_filter) j->flags.firstring = 1; else ixj_ring_on(j); } else { ixj_ring_off(j); if(!j->flags.cidsent) j->flags.cidring = 1; } } clear_bit(board, &j->busyflags); ixj_add_timer(j); return; } } if (!j->flags.ringing) { if (j->hookstate) { /* & 1) { */ if (j->dsp.low != 0x20 && SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) { SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); } LineMonitor(j); read_filters(j); ixj_WriteDSPCommand(0x511B, j); j->proc_load = j->ssr.high << 8 | j->ssr.low; if (!j->m_hook && (j->hookstate & 1)) { j->m_hook = j->ex.bits.hookstate = 1; ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN); } } else { if (j->ex.bits.dtmf_ready) { j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0; } if (j->m_hook) { j->m_hook = 0; j->ex.bits.hookstate = 1; ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN); } } } if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) { ixj_pstn_state(j); } if (j->ex.bytes) { wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */ } clear_bit(board, &j->busyflags); } ixj_add_timer(j);}static int ixj_status_wait(IXJ *j){ unsigned long jif; jif = jiffies + ((60 * hertz) / 100); while (!IsStatusReady(j)) { ixj_perfmon(j->statuswait); if (time_after(jiffies, jif)) { ixj_perfmon(j->statuswaitfail); return -1; } } return 0;}static int ixj_PCcontrol_wait(IXJ *j){ unsigned long jif; jif = jiffies + ((60 * hertz) / 100); while (!IsPCControlReady(j)) { ixj_perfmon(j->pcontrolwait); if (time_after(jiffies, jif)) { ixj_perfmon(j->pcontrolwaitfail); return -1; } } return 0;}static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j){ BYTES bytes; unsigned long jif; atomic_inc(&j->DSPWrite); if(atomic_read(&j->DSPWrite) > 1) { printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd); return -1; } bytes.high = (cmd & 0xFF00) >> 8; bytes.low = cmd & 0x00FF; jif = jiffies + ((60 * hertz) / 100); while (!IsControlReady(j)) { ixj_perfmon(j->iscontrolready); if (time_after(jiffies, jif)) { ixj_perfmon(j->iscontrolreadyfail); atomic_dec(&j->DSPWrite); if(atomic_read(&j->DSPWrite) > 0) { printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd); while(atomic_read(&j->DSPWrite) > 0) { atomic_dec(&j->DSPWrite); } } return -1; } } outb(bytes.low, j->DSPbase + 6); outb(bytes.high, j->DSPbase + 7); if (ixj_status_wait(j)) { j->ssr.low = 0xFF; j->ssr.high = 0xFF; atomic_dec(&j->DSPWrite); if(atomic_read(&j->DSPWrite) > 0) { printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd); while(atomic_read(&j->DSPWrite) > 0) { atomic_dec(&j->DSPWrite); } } return -1; }/* Read Software Status Register */ j->ssr.low = inb_p(j->DSPbase + 2); j->ssr.high = inb_p(j->DSPbase + 3); atomic_dec(&j->DSPWrite); if(atomic_read(&j->DSPWrite) > 0) { printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd); while(atomic_read(&j->DSPWrite) > 0) { atomic_dec(&j->DSPWrite); } } return 0;}/***************************************************************************** General Purpose IO Register read routine****************************************************************************/static inline int ixj_gpio_read(IXJ *j){ if (ixj_WriteDSPCommand(0x5143, j)) return -1; j->gpio.bytes.low = j->ssr.low; j->gpio.bytes.high = j->ssr.high; return 0;}static inline void LED_SetState(int state, IXJ *j){ if (j->cardtype == QTI_LINEJACK) { j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0; j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0; j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0; j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0; outb(j->pld_scrw.byte, j->XILINXbase); }}/********************************************************************** GPIO Pins are configured as follows on the Quicknet Internet* PhoneJACK Telephony Cards* * POTS Select GPIO_6=0 GPIO_7=0* Mic/Speaker Select GPIO_6=0 GPIO_7=1* Handset Select GPIO_6=1 GPIO_7=0** SLIC Active GPIO_1=0 GPIO_2=1 GPIO_5=0* SLIC Ringing GPIO_1=1 GPIO_2=1 GPIO_5=0* SLIC Open Circuit GPIO_1=0 GPIO_2=0 GPIO_5=0** Hook Switch changes reported on GPIO_3*********************************************************************/static int ixj_set_port(IXJ *j, int arg){ if (j->cardtype == QTI_PHONEJACK_LITE) { if (arg != PORT_POTS) return 10; else return 0; } switch (arg) { case PORT_POTS: j->port = PORT_POTS; switch (j->cardtype) { case QTI_PHONECARD: if (j->flags.pcmciasct == 1) SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); else return 11; break; case QTI_PHONEJACK_PCI: j->pld_slicw.pcib.mic = 0; j->pld_slicw.pcib.spk = 0; outb(j->pld_slicw.byte, j->XILINXbase + 0x01); break; case QTI_LINEJACK: ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */ if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */ return 2; j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ outb(j->pld_scrw.byte, j->XILINXbase); j->pld_clock.byte = 0; outb(j->pld_clock.byte, j->XILINXbase + 0x04); j->pld_slicw.bits.rly1 = 1; j->pld_slicw.bits.spken = 0; outb(j->pld_slicw.byte, j->XILINXbase + 0x01); ixj_mixer(0x1200, j); /* Turn Off MIC switch on mixer left */ ixj_mixer(0x1401, j); /* Turn On Mono1 switch on mixer left */ ixj_mixer(0x1300, j); /* Turn Off MIC switch on mixer right */ ixj_mixer(0x1501, j); /* Turn On Mono1 switch on mixer right */ ixj_mixer(0x0E80, j); /*Mic mute */ ixj_mixer(0x0F00, j); /* Set mono out (SLIC) to 0dB */ ixj_mixer(0x0080, j); /* Mute Master Left volume */ ixj_mixer(0x0180, j); /* Mute Master Right volume */ SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);/* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */ break; case QTI_PHONEJACK: j->gpio.bytes.high = 0x0B; j->gpio.bits.gpio6 = 0; j->gpio.bits.gpio7 = 0; ixj_WriteDSPCommand(j->gpio.word, j); break; } break; case PORT_PSTN: if (j->cardtype == QTI_LINEJACK) { ixj_WriteDSPCommand(0xC534, j); /* Write CODEC config to Software Control Register */ j->pld_slicw.bits.rly3 = 0; j->pld_slicw.bits.rly1 = 1; j->pld_slicw.bits.spken = 0; outb(j->pld_slicw.byte, j->XILINXbase + 0x01); j->port = PORT_PSTN; } else { return 4; } break; case PORT_SPEAKER: j->port = PORT_SPEAKER; switch (j->cardtype) { case QTI_PHONECARD: if (j->flags.pcmciasct) { SLIC_SetState(PLD_SLIC_STATE_OC, j); } break; case QTI_PHONEJACK_PCI: j->pld_slicw.pcib.mic = 1; j->pld_slicw.pcib.spk = 1; outb(j->pld_slicw.byte, j->XILINXbase + 0x01); break; case QTI_LINEJACK: ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */ if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */ return 2; j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ outb(j->pld_scrw.byte, j->XILINXbase); j->pld_clock.byte = 0; outb(j->pld_clock.byte, j->XILINXbase + 0x04); j->pld_slicw.bits.rly1 = 1; j->pld_slicw.bits.spken = 1; outb(j->pld_slicw.byte, j->XILINXbase + 0x01); ixj_mixer(0x1201, j); /* Turn On MIC switch on mixer left */ ixj_mixer(0x1400, j); /* Turn Off Mono1 switch on mixer left */ ixj_mixer(0x1301, j); /* Turn On MIC switch on mixer right */ ixj_mixer(0x1500, j); /* Turn Off Mono1 switch on mixer right */ ixj_mixer(0x0E06, j); /*Mic un-mute 0dB */ ixj_mixer(0x0F80, j); /* Mute mono out (SLIC) */ ixj_mixer(0x0000, j); /* Set Master Left volume to 0dB */ ixj_mixer(0x0100, j); /* Set Master Right volume to 0dB */ break; case QTI_PHONEJACK: j->gpio.bytes.high = 0x0B; j->gpio.bits.gpio6 = 0; j->gpio.bits.gpio7 = 1; ixj_WriteDSPCommand(j->gpio.word, j); break; } break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -