📄 ixj.c
字号:
ti.gain0 = 1; ti.freq0 = hz1600; ti.gain1 = 0; ti.freq1 = 0; ixj_init_tone(board, &ti); ti.tone_index = 21; ti.gain0 = 1; ti.freq0 = hz1800; ti.gain1 = 0; ti.freq1 = 0; ixj_init_tone(board, &ti); ti.tone_index = 22; ti.gain0 = 1; ti.freq0 = hz2100; ti.gain1 = 0; ti.freq1 = 0; ixj_init_tone(board, &ti); ti.tone_index = 23; ti.gain0 = 1; ti.freq0 = hz1300; ti.gain1 = 0; ti.freq1 = 0; ixj_init_tone(board, &ti); ti.tone_index = 24; ti.gain0 = 1; ti.freq0 = hz2450; ti.gain1 = 0; ti.freq1 = 0; ixj_init_tone(board, &ti); ti.tone_index = 25; ti.gain0 = 1; ti.freq0 = hz350; ti.gain1 = 0; ti.freq1 = hz440; ixj_init_tone(board, &ti); ti.tone_index = 26; ti.gain0 = 1; ti.freq0 = hz440; ti.gain1 = 0; ti.freq1 = hz480; ixj_init_tone(board, &ti); ti.tone_index = 27; ti.gain0 = 1; ti.freq0 = hz480; ti.gain1 = 0; ti.freq1 = hz620; ixj_init_tone(board, &ti); idle(board);// if(j->cardtype == 600) { // && j->flags.pcmciasct == 1 && j->readers == 1 && j->writers == 1) { SLIC_SetState(PLD_SLIC_STATE_OC, board);// } if (file_p->f_mode & FMODE_READ) j->readers--; if (file_p->f_mode & FMODE_WRITE) j->writers--; if (j->read_buffer && !j->readers) { kfree(j->read_buffer); j->read_buffer = NULL; j->read_buffer_size = 0; } if (j->write_buffer && !j->writers) { kfree(j->write_buffer); j->write_buffer = NULL; j->write_buffer_size = 0; } j->rec_codec = j->play_codec = 0; j->rec_frame_size = j->play_frame_size = 0; j->flags.cidsent = j->flags.cidring = 0; ixj_fasync(-1, file_p, 0); // remove from list of async notification if(j->cardtype == 300 && !j->readers && !j->writers) { ixj_set_port(board, PORT_PSTN); ixj_set_pots(board, 1); } ixj_WriteDSPCommand(0x0FE3, board); // Put the DSP in 1/5 power mode. file_p->private_data = NULL; MOD_DEC_USE_COUNT; return 0;}static int read_filters(int board){ unsigned short fc, cnt; int var; IXJ *j = &ixj[board]; if (ixj_WriteDSPCommand(0x5144, board)) return -1; fc = j->ssr.high << 8 | j->ssr.low; if (fc == j->frame_count) return 1; j->frame_count = fc; if (j->dtmf_proc) return 1; var = 10; for (cnt = 0; cnt < 4; cnt++) { if (ixj_WriteDSPCommand(0x5154 + cnt, board)) return -1; if (ixj_WriteDSPCommand(0x515C, board)) return -1; j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low; if (j->cadence_f[cnt].enable) { if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) { if (j->cadence_f[cnt].state == 0) { j->cadence_f[cnt].state = 1; j->cadence_f[cnt].on1min = jiffies + (j->cadence_f[cnt].on1 * hertz * (100 - var) / 10000); j->cadence_f[cnt].on1dot = jiffies + (j->cadence_f[cnt].on1 * hertz * (100) / 10000); j->cadence_f[cnt].on1max = jiffies + (j->cadence_f[cnt].on1 * hertz * (100 + var) / 10000); } else if (j->cadence_f[cnt].state == 2 && (time_after(jiffies, j->cadence_f[cnt].off1min) && time_before(jiffies, j->cadence_f[cnt].off1max))) { if (j->cadence_f[cnt].on2) { j->cadence_f[cnt].state = 3; j->cadence_f[cnt].on2min = jiffies + (j->cadence_f[cnt].on2 * hertz * (100 - var) / 10000); j->cadence_f[cnt].on2dot = jiffies + (j->cadence_f[cnt].on2 * hertz * (100) / 10000); j->cadence_f[cnt].on2max = jiffies + (j->cadence_f[cnt].on2 * hertz * (100 + var) / 10000); } else { j->cadence_f[cnt].state = 6; } } else if (j->cadence_f[cnt].state == 4 && (time_after(jiffies, j->cadence_f[cnt].off2min) && time_before(jiffies, j->cadence_f[cnt].off2max))) { if (j->cadence_f[cnt].on2) { j->cadence_f[cnt].state = 5; j->cadence_f[cnt].on3min = jiffies + (j->cadence_f[cnt].on3 * hertz * (100 - var) / 10000); j->cadence_f[cnt].on3dot = jiffies + (j->cadence_f[cnt].on3 * hertz * (100) / 10000); j->cadence_f[cnt].on3max = jiffies + (j->cadence_f[cnt].on3 * hertz * (100 + var) / 10000); } else { j->cadence_f[cnt].state = 6; } } else { j->cadence_f[cnt].state = 0; } } else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) { if (j->cadence_f[cnt].state == 1 && (time_after(jiffies, j->cadence_f[cnt].on1min) && time_before(jiffies, j->cadence_f[cnt].on1max))) { j->cadence_f[cnt].state = 2; j->cadence_f[cnt].off1min = jiffies + (j->cadence_f[cnt].off1 * hertz * (100 - var) / 10000); j->cadence_f[cnt].off1max = jiffies + (j->cadence_f[cnt].off1 * hertz * (100 + var) / 10000); } else if (j->cadence_f[cnt].state == 3 && (time_after(jiffies, j->cadence_f[cnt].on2min) && time_before(jiffies, j->cadence_f[cnt].on2max))) { j->cadence_f[cnt].state = 4; j->cadence_f[cnt].off2min = jiffies + (j->cadence_f[cnt].off2 * hertz * (100 - var) / 10000); j->cadence_f[cnt].off2max = jiffies + (j->cadence_f[cnt].off2 * hertz * (100 + var) / 10000); } else if (j->cadence_f[cnt].state == 5 && (time_after(jiffies, j->cadence_f[cnt].on3min) && time_before(jiffies, j->cadence_f[cnt].on3max))) { j->cadence_f[cnt].state = 6; j->cadence_f[cnt].off3min = jiffies + (j->cadence_f[cnt].off3 * hertz * (100 - var) / 10000); j->cadence_f[cnt].off3max = jiffies + (j->cadence_f[cnt].off3 * hertz * (100 + var) / 10000); } else { j->cadence_f[cnt].state = 0; } } else { switch(j->cadence_f[cnt].state) { case 1: if(time_after(jiffies, j->cadence_f[cnt].on1dot) && !j->cadence_f[cnt].off1 && !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 && !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) { j->cadence_f[cnt].state = 6; } break; case 3: if(time_after(jiffies, j->cadence_f[cnt].on2dot) && !j->cadence_f[cnt].off2 && !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) { j->cadence_f[cnt].state = 6; } break; case 5: if(time_after(jiffies, j->cadence_f[cnt].on3dot) && !j->cadence_f[cnt].off3) { j->cadence_f[cnt].state = 6; } break; } } } if (j->cadence_f[cnt].state == 6) { j->cadence_f[cnt].state = 0; if (j->cadence_f[cnt].enable == 1) j->cadence_f[cnt].enable = 0; switch (cnt) { case 0: j->ex.bits.fc0 = 1; break; case 1: j->ex.bits.fc1 = 1; break; case 2: j->ex.bits.fc2 = 1; break; case 3: j->ex.bits.fc3 = 1; break; } } if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) || (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) { switch (cnt) { case 0: j->ex.bits.f0 = 1; break; case 1: j->ex.bits.f1 = 1; break; case 2: j->ex.bits.f2 = 1; break; case 3: j->ex.bits.f3 = 1; break; } } } return 0;}static int LineMonitor(int board){ IXJ *j = &ixj[board]; if (j->dtmf_proc) { return -1; } j->dtmf_proc = 1; if (ixj_WriteDSPCommand(0x7000, board)) // Line Monitor return -1; j->dtmf.bytes.high = j->ssr.high; j->dtmf.bytes.low = j->ssr.low; if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) { j->dtmf_state = 1; j->dtmf_current = j->dtmf.bits.digit; } if (j->dtmf_state && !j->dtmf.bits.dtmf_valid) // && j->dtmf_wp != j->dtmf_rp) { if(!j->flags.cidplay) { j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current; j->dtmf_wp++; if (j->dtmf_wp == 79) j->dtmf_wp = 0; j->ex.bits.dtmf_ready = 1; } else if(j->dtmf_current == 25 || j->dtmf_current == 31) { j->flags.cidcw_ack = 1; } j->dtmf_state = 0; } j->dtmf_proc = 0; return 0;}ssize_t ixj_read(struct file * file_p, char *buf, size_t length, loff_t * ppos){ unsigned long i = *ppos; IXJ *j = &ixj[NUM(file_p->f_dentry->d_inode->i_rdev)]; DECLARE_WAITQUEUE(wait, current); if (j->flags.inread) return -EALREADY; j->flags.inread = 1; add_wait_queue(&j->read_q, &wait); set_current_state(TASK_INTERRUPTIBLE); mb(); while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) { ++j->read_wait; if(j->tone_state) { set_current_state(TASK_RUNNING); remove_wait_queue(&j->read_q, &wait); j->flags.inread = 0; return -EAGAIN; } if (file_p->f_flags & O_NONBLOCK) { set_current_state(TASK_RUNNING); remove_wait_queue(&j->read_q, &wait); j->flags.inread = 0; return -EAGAIN; } if (!ixj_hookstate(NUM(file_p->f_dentry->d_inode->i_rdev))) { set_current_state(TASK_RUNNING); remove_wait_queue(&j->read_q, &wait); j->flags.inread = 0; return 0; } interruptible_sleep_on(&j->read_q); if (signal_pending(current)) { set_current_state(TASK_RUNNING); remove_wait_queue(&j->read_q, &wait); j->flags.inread = 0; return -EINTR; } } remove_wait_queue(&j->read_q, &wait); set_current_state(TASK_RUNNING); /* Don't ever copy more than the user asks */ i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size)); j->read_buffer_ready = 0; if (i) { j->flags.inread = 0; return -EFAULT; } else { j->flags.inread = 0; return min(length, j->read_buffer_size); }}ssize_t ixj_enhanced_read(struct file * file_p, char *buf, size_t length, loff_t * ppos){ int pre_retval; ssize_t read_retval = 0; IXJ *j = &ixj[NUM(file_p->f_dentry->d_inode->i_rdev)]; pre_retval = ixj_PreRead(j, 0L); switch (pre_retval) { case NORMAL: read_retval = ixj_read(file_p, buf, length, ppos); ixj_PostRead(j, 0L); break; case NOPOST: read_retval = ixj_read(file_p, buf, length, ppos); break; case POSTONLY: ixj_PostRead(j, 0L); break; default: read_retval = pre_retval; } return read_retval;}ssize_t ixj_write(struct file *file_p, const char *buf, size_t count, loff_t * ppos){ unsigned long i = *ppos; IXJ *j = file_p->private_data; DECLARE_WAITQUEUE(wait, current); if (j->flags.inwrite) return -EALREADY; j->flags.inwrite = 1; add_wait_queue(&j->write_q, &wait); set_current_state(TASK_INTERRUPTIBLE); mb(); while (!j->write_buffers_empty) { ++j->write_wait; if(j->tone_state) { set_current_state(TASK_RUNNING); remove_wait_queue(&j->write_q, &wait); j->flags.inwrite = 0; return -EAGAIN; } if (file_p->f_flags & O_NONBLOCK) { set_current_state(TASK_RUNNING); remove_wait_queue(&j->write_q, &wait); j->flags.inwrite = 0; return -EAGAIN; } if (!ixj_hookstate(NUM(file_p->f_dentry->d_inode->i_rdev))) { set_current_state(TASK_RUNNING); remove_wait_queue(&j->write_q, &wait); j->flags.inwrite = 0; return 0; } interruptible_sleep_on(&j->write_q); if (signal_pending(current)) { set_current_state(TASK_RUNNING); remove_wait_queue(&j->write_q, &wait); j->flags.inwrite = 0; return -EINTR; } } set_current_state(TASK_RUNNING); remove_wait_queue(&j->write_q, &wait); if (j->write_buffer_wp + count >= j->write_buffer_end) j->write_buffer_wp = j->write_buffer; i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size)); if (i) { j->flags.inwrite = 0; return -EFAULT; } j->flags.inwrite = 0; return min(count, j->write_buffer_size);}ssize_t ixj_enhanced_write(struct file * file_p, const char *buf, size_t count, loff_t * ppos){ int pre_retval; ssize_t write_retval = 0; IXJ *j = &ixj[NUM(file_p->f_dentry->d_inode->i_rdev)]; pre_retval = ixj_PreWrite(j, 0L); switch (pre_retval) { case NORMAL: write_retval = ixj_write(file_p, buf, count, ppos); if (write_retval != -EFAULT) { ixj_PostWrite(j, 0L); j->write_buffer_wp += count; j->write_buffers_empty--; } break; case NOPOST: write_retval = ixj_write(file_p, buf, count, ppos); if (write_retval != -EFAULT) { j->write_buffer_wp += count; j->write_buffers_empty--; } break; case POSTONLY: ixj_PostWrite(j, 0L); break; default: write_retval = pre_retval; } return write_retval;}static void ixj_read_frame(int board){ int cnt, dly; IXJ *j = &ixj[board]; if (j->read_buffer) { for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) { if (!(cnt % 16) && !IsRxReady(board)) { dly = 0; while (!IsRxReady(board)) { if (dly++ > 5) { dly = 0; break; } udelay(10); } } // Throw away word 0 of the 8021 compressed format to get standard G.729. if (j->rec_codec == G729 && (cnt == 0 || cnt == 5 || cnt == 10)) { inb_p(j->DSPbase + 0x0E); inb_p(j->DSPbase + 0x0F); } *(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E); *(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F); } ++j->framesread; if (j->intercom != -1) { if (IsTxReady(j->intercom)) { for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) { if (!(cnt % 16) && !IsTxReady(board)) { dly = 0; while (!IsTxReady(board)) { if (dly++ > 5) { dly = 0; break; } udelay(10); } } outb_p(*(j->read_buffer + cnt), ixj[j->intercom].DSPbase + 0x0C); outb_p(*(j->read_buffer + cnt + 1), ixj[j->intercom].DSPbase + 0x0D); } ++ixj[j->intercom].frameswritten; } } else { j->read_buffer_ready = 1; wake_up_interruptible(&j->read_q); // Wake any blocked readers wake_up_interruptible(&j->poll_q); // Wake any blocked selects ixj_kill_fasync(board, POLL_OUT); } }}static short fsk[][6][20] ={ { { 0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196, -16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722 }, { -28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -