📄 ixj.c
字号:
ixj_PreIoctl = &Stub; break; case POST_IOCTL: ixj_PostIoctl = &Stub; break; default: retval = 1; } return retval;}EXPORT_SYMBOL(ixj_unregister);static void ixj_init_timer(IXJ *j){ init_timer(&j->timer); j->timer.function = ixj_timeout; j->timer.data = (unsigned long)j;}static void ixj_add_timer(IXJ *j){ j->timer.expires = jiffies + (hertz / samplerate); add_timer(&j->timer);}static void ixj_tone_timeout(IXJ *j){ IXJ_TONE ti; j->tone_state++; if (j->tone_state == 3) { j->tone_state = 0; if (j->cadence_t) { j->tone_cadence_state++; if (j->tone_cadence_state >= j->cadence_t->elements_used) { switch (j->cadence_t->termination) { case PLAY_ONCE: ixj_cpt_stop(j); break; case REPEAT_LAST_ELEMENT: j->tone_cadence_state--; ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index); break; case REPEAT_ALL: j->tone_cadence_state = 0; if (j->cadence_t->ce[j->tone_cadence_state].freq0) { ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index; ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0; ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0; ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1; ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1; ixj_init_tone(j, &ti); } ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j); ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j); ixj_play_tone(j, j->cadence_t->ce[0].index); break; } } else { if (j->cadence_t->ce[j->tone_cadence_state].gain0) { ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index; ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0; ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0; ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1; ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1; ixj_init_tone(j, &ti); } ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j); ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j); ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index); } } }}static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir){ if(j->ixj_signals[event]) { if(ixjdebug & 0x0100) printk("Sending signal for event %d\n", event); /* Send apps notice of change */ /* see config.h for macro definition */ kill_fasync(&(j->async_queue), j->ixj_signals[event], dir); }}static void ixj_pstn_state(IXJ *j){ int var; union XOPXR0 XR0, daaint; var = 10; XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg; daaint.reg = 0; XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR; j->pld_scrr.byte = inb_p(j->XILINXbase); if (j->pld_scrr.bits.daaflag) { daa_int_read(j); if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) { if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) { daaint.bitreg.RING = 1; if(ixjdebug & 0x0008) { printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies); } } else { daa_set_mode(j, SOP_PU_RESET); } } if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) { daaint.bitreg.Caller_ID = 1; j->pstn_cid_intr = 1; j->pstn_cid_received = jiffies; if(ixjdebug & 0x0008) { printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies); } } if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) { daaint.bitreg.Cadence = 1; if(ixjdebug & 0x0008) { printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies); } } if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) { daaint.bitreg.VDD_OK = 1; daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK; } } daa_CR_read(j, 1); if(j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR != XR0.bitreg.RMR && time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) { daaint.bitreg.RMR = 1; daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR; if(ixjdebug & 0x0008) { printk(KERN_INFO "IXJ DAA RMR /dev/phone%d was %s for %ld\n", j->board, XR0.bitreg.RMR?"on":"off", jiffies - j->pstn_last_rmr); } j->pstn_prev_rmr = j->pstn_last_rmr; j->pstn_last_rmr = jiffies; } switch(j->daa_mode) { case SOP_PU_SLEEP: if (daaint.bitreg.RING) { if (!j->flags.pstn_ringing) { if (j->daa_mode != SOP_PU_RINGING) { j->pstn_ring_int = jiffies; daa_set_mode(j, SOP_PU_RINGING); } } } break; case SOP_PU_RINGING: if (daaint.bitreg.RMR) { if (ixjdebug & 0x0008) { printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies); } if (daaint.bitreg.SI_1) { /* Rising edge of RMR */ j->flags.pstn_rmr = 1; j->pstn_ring_start = jiffies; j->pstn_ring_stop = 0; j->ex.bits.pstn_ring = 0; if (j->cadence_f[4].state == 0) { j->cadence_f[4].state = 1; j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000); j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000); j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000); } else if (j->cadence_f[4].state == 2) { if((time_after(jiffies, j->cadence_f[4].off1min) && time_before(jiffies, j->cadence_f[4].off1max))) { if (j->cadence_f[4].on2) { j->cadence_f[4].state = 3; j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000)); j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000)); j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000)); } else { j->cadence_f[4].state = 7; } } else { if (ixjdebug & 0x0008) { printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, j->cadence_f[4].off1); } j->cadence_f[4].state = 0; } } else if (j->cadence_f[4].state == 4) { if((time_after(jiffies, j->cadence_f[4].off2min) && time_before(jiffies, j->cadence_f[4].off2max))) { if (j->cadence_f[4].on3) { j->cadence_f[4].state = 5; j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000)); j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000)); j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000)); } else { j->cadence_f[4].state = 7; } } else { if (ixjdebug & 0x0008) { printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, j->cadence_f[4].off2); } j->cadence_f[4].state = 0; } } else if (j->cadence_f[4].state == 6) { if((time_after(jiffies, j->cadence_f[4].off3min) && time_before(jiffies, j->cadence_f[4].off3max))) { j->cadence_f[4].state = 7; } else { if (ixjdebug & 0x0008) { printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, j->cadence_f[4].off3); } j->cadence_f[4].state = 0; } } else { j->cadence_f[4].state = 0; } } else { /* Falling edge of RMR */ j->pstn_ring_start = 0; j->pstn_ring_stop = jiffies; if (j->cadence_f[4].state == 1) { if(!j->cadence_f[4].on1) { j->cadence_f[4].state = 7; } else if((time_after(jiffies, j->cadence_f[4].on1min) && time_before(jiffies, j->cadence_f[4].on1max))) { if (j->cadence_f[4].off1) { j->cadence_f[4].state = 2; j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000)); j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000)); j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000)); } else { j->cadence_f[4].state = 7; } } else { if (ixjdebug & 0x0008) { printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, j->cadence_f[4].on1); } j->cadence_f[4].state = 0; } } else if (j->cadence_f[4].state == 3) { if((time_after(jiffies, j->cadence_f[4].on2min) && time_before(jiffies, j->cadence_f[4].on2max))) { if (j->cadence_f[4].off2) { j->cadence_f[4].state = 4; j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000)); j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000)); j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000)); } else { j->cadence_f[4].state = 7; } } else { if (ixjdebug & 0x0008) { printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, j->cadence_f[4].on2); } j->cadence_f[4].state = 0; } } else if (j->cadence_f[4].state == 5) { if((time_after(jiffies, j->cadence_f[4].on3min) && time_before(jiffies, j->cadence_f[4].on3max))) { if (j->cadence_f[4].off3) { j->cadence_f[4].state = 6; j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000)); j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000)); j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000)); } else { j->cadence_f[4].state = 7; } } else { j->cadence_f[4].state = 0; } } else { if (ixjdebug & 0x0008) { printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, j->cadence_f[4].on3); } j->cadence_f[4].state = 0; } } if (ixjdebug & 0x0010) { printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies); } if (ixjdebug & 0x0010) { switch(j->cadence_f[4].state) { case 1: printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max); break; case 2: printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max); break; case 3: printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max); break; case 4: printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max); break; case 5: printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max); break; case 6: printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max); break; } } } if (j->cadence_f[4].state == 7) { j->cadence_f[4].state = 0; j->pstn_ring_stop = jiffies; j->ex.bits.pstn_ring = 1; ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN); if(ixjdebug & 0x0008) { printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies); } } if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) || (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) { if(ixjdebug & 0x0008) { printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies); printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int); printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop); } j->pstn_ring_stop = j->pstn_ring_int = 0; daa_set_mode(j, SOP_PU_SLEEP); } outb_p(j->pld_scrw.byte, j->XILINXbase); if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) { ixj_daa_cid_read(j); j->ex.bits.caller_id = 1; ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN); j->pstn_cid_intr = 0; } if (daaint.bitreg.Cadence) { if(ixjdebug & 0x0008) { printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board); } daa_set_mode(j, SOP_PU_SLEEP); j->ex.bits.pstn_ring = 0; } break; case SOP_PU_CONVERSATION: if (daaint.bitreg.VDD_OK) { if(!daaint.bitreg.SI_0) { if (!j->pstn_winkstart) { if(ixjdebug & 0x0008) { printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies); } j->pstn_winkstart = jiffies; } } else { if (j->pstn_winkstart) { if(ixjdebug & 0x0008) { printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies); } j->pstn_winkstart = 0; } } } if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) { if(ixjdebug & 0x0008) { printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies); } daa_set_mode(j, SOP_PU_SLEEP); j->pstn_winkstart = 0; j->ex.bits.pstn_wink = 1; ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN); } break; }}static void ixj_timeout(unsigned long ptr){ int board; unsigned long jifon; IXJ *j = (IXJ *)ptr; board = j->board; if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) { ixj_perfmon(j->timerchecks); j->hookstate = ixj_hookstate(j); if (j->tone_state) { if (!(j->hookstate)) { ixj_cpt_stop(j); if (j->m_hook) { j->m_hook = 0; j->ex.bits.hookstate = 1; ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN); } clear_bit(board, &j->busyflags); ixj_add_timer(j); return; } if (j->tone_state == 1) jifon = ((hertz * j->tone_on_time) * 25 / 100000); else jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000); if (time_before(jiffies, j->tone_start_jif + jifon)) { if (j->tone_state == 1) { ixj_play_tone(j, j->tone_index); if (j->dsp.low == 0x20) { clear_bit(board, &j->busyflags); ixj_add_timer(j); return; } } else { ixj_play_tone(j, 0); if (j->dsp.low == 0x20) { clear_bit(board, &j->busyflags); ixj_add_timer(j); return; } } } else { ixj_tone_timeout(j); if (j->flags.dialtone) { ixj_dialtone(j); } if (j->flags.busytone) { ixj_busytone(j); if (j->dsp.low == 0x20) { clear_bit(board, &j->busyflags); ixj_add_timer(j); return; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -