📄 ixj.c
字号:
-32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876 }, { -28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715, -16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846 }, { 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, 32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876 }, { 28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715, 16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846 } }, { { 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126, 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126 }, { -28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051, 28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051 }, { -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925, 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925 }, { 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126, 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126 }, { 28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051, -28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051 }, { 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925, -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925 } }};static void ixj_write_cid_bit(int board, int bit){ int dly; IXJ_WORD dat; IXJ *j = &ixj[board]; while (j->fskcnt < 20) { if (!IsTxReady(board)) { dly = 0; while (!IsTxReady(board)) { if (dly++ > 5) { dly = 0; // break; // printk("CID delay\n"); } udelay(10); } } dat.word = j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt]; outb_p(dat.bytes.low, j->DSPbase + 0x0C); outb_p(dat.bytes.high, j->DSPbase + 0x0D); j->fskcnt += 3; } j->fskcnt %= 20; if (!bit) j->fskz++; if (j->fskz >= 6) j->fskz = 0;}static void ixj_write_cid_byte(int board, char byte){ IXJ_CBYTE cb;// printk("Writing CID data %x - %c\n", byte, byte); cb.cbyte = byte; ixj_write_cid_bit(board, 0); ixj_write_cid_bit(board, cb.cbits.b0 ? 1 : 0); ixj_write_cid_bit(board, cb.cbits.b1 ? 1 : 0); ixj_write_cid_bit(board, cb.cbits.b2 ? 1 : 0); ixj_write_cid_bit(board, cb.cbits.b3 ? 1 : 0); ixj_write_cid_bit(board, cb.cbits.b4 ? 1 : 0); ixj_write_cid_bit(board, cb.cbits.b5 ? 1 : 0); ixj_write_cid_bit(board, cb.cbits.b6 ? 1 : 0); ixj_write_cid_bit(board, cb.cbits.b7 ? 1 : 0); ixj_write_cid_bit(board, 1);}static void ixj_write_cid_seize(int board){ int cnt; for (cnt = 0; cnt < 150; cnt++) { ixj_write_cid_bit(board, 0); ixj_write_cid_bit(board, 1); } for (cnt = 0; cnt < 180; cnt++) { ixj_write_cid_bit(board, 1); }}static void ixj_write_cidcw_seize(int board){ int cnt; for (cnt = 0; cnt < 80; cnt++) { ixj_write_cid_bit(board, 1); }}static int ixj_write_cid_string(int board, char *s, int checksum){ int cnt; for (cnt = 0; cnt < strlen(s); cnt++) { ixj_write_cid_byte(board, s[cnt]); checksum = (checksum + s[cnt]); } return checksum;}static void ixj_pad_fsk(int board, int pad){ int cnt, dly; IXJ *j = &ixj[board]; for (cnt = 0; cnt < pad; cnt++) { if (!IsTxReady(board)) { dly = 0; while (!IsTxReady(board)) { if (dly++ > 5) { dly = 0; } udelay(10); } } outb_p(0x00, j->DSPbase + 0x0C); outb_p(0x00, j->DSPbase + 0x0D); } for (cnt = 0; cnt < 720; cnt++) { if (!IsTxReady(board)) { dly = 0; while (!IsTxReady(board)) { if (dly++ > 5) { dly = 0; } udelay(10); } } outb_p(0x00, j->DSPbase + 0x0C); outb_p(0x00, j->DSPbase + 0x0D); }}static void ixj_write_cid(int board){ IXJ *j = &ixj[board]; char sdmf1[50]; char sdmf2[50]; char sdmf3[80]; char mdmflen, len1, len2, len3; int pad; int checksum = 0; if (ixj[board].dsp.low == 0x20) return; ixj[board].fskz = ixj[board].fskphase = ixj[board].fskcnt = ixj[board].fskdcnt = 0; ixj[board].flags.cidplay = 1; strcpy(sdmf1, j->cid_send.month); strcat(sdmf1, j->cid_send.day); strcat(sdmf1, j->cid_send.hour); strcat(sdmf1, j->cid_send.min); strcpy(sdmf2, j->cid_send.number); strcpy(sdmf3, j->cid_send.name); len1 = strlen(sdmf1); len2 = strlen(sdmf2); len3 = strlen(sdmf3); mdmflen = len1 + len2 + len3 + 6; printk("CID Lengths = %d %d %d %d\n", len1, len2, len3, mdmflen); set_base_frame(board, 30); set_play_codec(board, LINEAR16); if (ixj[board].port == PORT_POTS) if(!j->r_hook) SLIC_SetState(PLD_SLIC_STATE_OHT, board); set_play_volume(board, 0x1B); ixj_play_start(board); ixj_write_cid_seize(board); ixj_write_cid_byte(board, 0x80); checksum = 0x80; ixj_write_cid_byte(board, mdmflen); checksum = checksum + mdmflen; ixj_write_cid_byte(board, 0x01); checksum = checksum + 0x01; ixj_write_cid_byte(board, len1); checksum = checksum + len1; checksum = ixj_write_cid_string(board, sdmf1, checksum); ixj_write_cid_byte(board, 0x02); checksum = checksum + 0x02; ixj_write_cid_byte(board, len2); checksum = checksum + len2; checksum = ixj_write_cid_string(board, sdmf2, checksum); ixj_write_cid_byte(board, 0x07); checksum = checksum + 0x07; ixj_write_cid_byte(board, len3); checksum = checksum + len3; checksum = ixj_write_cid_string(board, sdmf3, checksum); checksum %= 256; checksum ^= 0xFF; checksum += 1; printk("14Checksum = %d\n", checksum); ixj_write_cid_byte(board, (char) checksum); pad = j->fskdcnt % 240; if (pad) { pad = 240 - pad; } ixj_pad_fsk(board, pad); SLIC_SetState(PLD_SLIC_STATE_STANDBY, board); ixj[board].flags.cidplay = 0; ixj_play_stop(board);}static void ixj_write_cidcw(int board){ IXJ_TONE ti; IXJ *j = &ixj[board]; char sdmf1[50]; char sdmf2[50]; char sdmf3[80]; char mdmflen, len1, len2, len3; int pad; int checksum = 0; if (ixj[board].dsp.low == 0x20) return; ixj[board].fskz = ixj[board].fskphase = ixj[board].fskcnt = ixj[board].fskdcnt = 0; ixj[board].flags.cidplay = 1; ti.tone_index = 23; ti.gain0 = 1; ti.freq0 = hz440; ti.gain1 = 0; ti.freq1 = 0; ixj_init_tone(board, &ti); ti.tone_index = 24; ti.gain0 = 1; ti.freq0 = hz2130; ti.gain1 = 0; ti.freq1 = hz2750; ixj_init_tone(board, &ti); ixj_set_tone_on(1200, board); ixj_play_tone(board, 23); while(j->tone_state) { set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(1); } ixj_set_tone_on(320, board); ixj_play_tone(board, 24); while(j->tone_state) { set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(1); } j->cidcw_wait = jiffies + (200 * hertz / 100000); while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait)) { set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(1); } if(!j->flags.cidcw_ack) { return; } strcpy(sdmf1, j->cid_send.month); strcat(sdmf1, j->cid_send.day); strcat(sdmf1, j->cid_send.hour); strcat(sdmf1, j->cid_send.min); strcpy(sdmf2, j->cid_send.number); strcpy(sdmf3, j->cid_send.name); len1 = strlen(sdmf1); len2 = strlen(sdmf2); len3 = strlen(sdmf3); mdmflen = len1 + len2 + len3 + 6; printk("CID Lengths = %d %d %d %d\n", len1, len2, len3, mdmflen); j->cid_play_codec = j->play_codec; ixj_play_stop(board); switch(j->baseframe.low) { case 0xA0: j->cid_base_frame_size = 20; break; case 0x50: j->cid_base_frame_size = 10; break; default: j->cid_base_frame_size = 30; break; } set_base_frame(board, 30); set_play_codec(board, LINEAR16); set_play_volume(board, 0x1B); ixj_play_start(board); ixj_write_cidcw_seize(board); ixj_write_cid_byte(board, 0x80); checksum = 0x80; ixj_write_cid_byte(board, mdmflen); checksum = checksum + mdmflen; ixj_write_cid_byte(board, 0x01); checksum = checksum + 0x01; ixj_write_cid_byte(board, len1); checksum = checksum + len1; checksum = ixj_write_cid_string(board, sdmf1, checksum); ixj_write_cid_byte(board, 0x02); checksum = checksum + 0x02; ixj_write_cid_byte(board, len2); checksum = checksum + len2; checksum = ixj_write_cid_string(board, sdmf2, checksum); ixj_write_cid_byte(board, 0x07); checksum = checksum + 0x07; ixj_write_cid_byte(board, len3); checksum = checksum + len3; checksum = ixj_write_cid_string(board, sdmf3, checksum); checksum %= 256; checksum ^= 0xFF; checksum += 1; printk("14Checksum = %d\n", checksum); ixj_write_cid_byte(board, (char) checksum); pad = j->fskdcnt % 240; if (pad) { pad = 240 - pad; } ixj_pad_fsk(board, pad); ixj[board].flags.cidplay = 0; ixj_play_stop(board); set_base_frame(board, j->cid_base_frame_size); set_play_codec(board, j->cid_play_codec);}static void ixj_write_vmwi(int board, int msg){ IXJ *j = &ixj[board]; char mdmflen; int pad; int checksum = 0; if (ixj[board].dsp.low == 0x20) return; ixj[board].fskz = ixj[board].fskphase = ixj[board].fskcnt = ixj[board].fskdcnt = 0; ixj[board].flags.cidplay = 1; mdmflen = 3; set_base_frame(board, 30); set_play_codec(board, LINEAR16); if (ixj[board].port == PORT_POTS) SLIC_SetState(PLD_SLIC_STATE_OHT, board); set_play_volume(board, 0x1B); ixj_play_start(board); ixj_write_cid_seize(board); ixj_write_cid_byte(board, 0x82); checksum = 0x82; ixj_write_cid_byte(board, mdmflen); checksum = checksum + mdmflen; ixj_write_cid_byte(board, 0x0B); checksum = checksum + 0x0B; ixj_write_cid_byte(board, 1); checksum = checksum + 1; if(msg) { ixj_write_cid_byte(board, 0xFF); checksum = checksum + 0xFF; } else { ixj_write_cid_byte(board, 0x00); checksum = checksum + 0x00; } checksum %= 256; checksum ^= 0xFF; checksum += 1; ixj_write_cid_byte(board, (char) checksum); pad = j->fskdcnt % 240; if (pad) { pad = 240 - pad; } ixj_pad_fsk(board, pad); SLIC_SetState(PLD_SLIC_STATE_STANDBY, board); ixj[board].flags.cidplay = 0; ixj_play_stop(board);}static void ixj_write_frame(int board){ int cnt, frame_count, dly; BYTES blankword; IXJ *j = &ixj[board]; frame_count = 0; if (j->write_buffer && j->write_buffers_empty < 2) { if (j->write_buffer_wp > j->write_buffer_rp) { frame_count = (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2); } if (j->write_buffer_rp > j->write_buffer_wp) { frame_count = (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) + (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2); } if (frame_count >= 1) { if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) { switch (j->play_mode) { case PLAYBACK_MODE_ULAW: case PLAYBACK_MODE_ALAW: blankword.low = blankword.high = 0xFF; break; case PLAYBACK_MODE_8LINEAR: case PLAYBACK_MODE_16LINEAR: blankword.low = blankword.high = 0x00; break; case PLAYBACK_MODE_8LINEAR_WSS: blankword.low = blankword.high = 0x80; break; } for (cnt = 0; cnt < 16; cnt++) { if (!(cnt % 16) && !IsTxReady(board)) { dly = 0; while (!IsTxReady(board)) { if (dly++ > 5) { dly = 0; break; } udelay(10); } } outb_p((blankword.low), j->DSPbase + 0x0C); outb_p((blankword.high), j->DSPbase + 0x0D); } j->flags.play_first_frame = 0; } for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) { if (!(cnt % 16) && !IsTxReady(board)) { dly = 0; while (!IsTxRe
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -