📄 clm_dspdrv.c
字号:
wx++; if (wx != (patch[i*2] | (patch[i*2+1] << 8))) break; } current_command[2] = pcnt; send_pkt_to_dsp(); }}voidConfigPatch (unsigned char p1){ if (mt_x2_connection || mt_v90_connection) return; current_command[0] = 0x9a; current_command[1] = 0; current_command[2] = 2; current_command[3] = 0; current_command[4] = p1; current_command[5] = 0; ack_or_response = 0; send_pkt_to_dsp ();}voidDspPatch (int n){ void *patch; if (mt_x2_connection || mt_v90_connection) return; if (n == 1) { DnldPatch (common_patch); //patch = v90_com_patch; patch = data_patch; /* FIXME */ } else if (n == 2) patch = data_patch; else if ((n == 3) || (n == 4)) patch = training_patch; else patch = voice_patch; /* 5,6 */ /* if (((n == 1) && mt_v90_configured) || ((n>1) && (n<=6))) */ if ((n>1) && (n<=6)) DnldPatch (patch); WriteToDsp (0x17e4, 0x7c00);}voidResetDspIdle(void){ line_bit_rate = 0; mt_x2_connection = 0; mt_v90_connection = 0; call_progress_state = 0; if (mt_IdleSendPwron) { DnldPoweronPatch (); set_hook_relay (0); set_voice_relay (0); set_cid_relay (0); set_spk_hs_relay (0); } else mt_IdleSendPwron = 1; // FIXME TESTING current_command[0] = 0x60; current_command[1] = 0; current_command[2] = 0; current_command[3] = 0; ack_or_response = 0; send_pkt_to_dsp (); ConfigPatch (5); DspPatch (1); DspPatch (5); ConfigPatch (3);}/**************************************************************/intcall_progress(void){ unsigned char preg; preg = read_dsp_call_progress_reg (); if ((preg == 7) || (preg == 2)) preg = 0; if (mt_RingState) { preg = mt_RingState; if (mt_RingState == 7) mt_RingState = 0; } return preg;}unsigned charReadDspPcmStatusReg(void){ unsigned char x; dspdrv_ReadCram (0x3c, &x, 1); return x;}unsigned charread_dsp_modem_status_reg(void){ unsigned char x; dspdrv_ReadCram (0x36, &x, 1); return x;}unsigned charread_dsp_call_progress_reg(void){ dspdrv_ReadCram (0x38, &mt_call_progress, 1); return mt_call_progress;}/******************************************************** */voidset_hook_relay(int n){ unsigned char rv; rv = get_register(0xf0) | 0x4; set_register (0xf0, rv); rv = get_register(0xf3) & 0xfb; set_register (0xf3, rv); rv = get_register(0xf2); if (n == 1) rv &= 0xfb; else rv |= 0x4; set_register (0xf2, rv);}voidset_voice_relay(int n){ unsigned char rv; rv = get_register(0xf0) | 0x40; set_register (0xf0, rv); rv = get_register(0xf3) & 0xbf; set_register (0xf3, rv); rv = get_register(0xf2); if (n == 1) rv &= 0xbf; else rv |= 0x40; set_register (0xf2, rv);}voidset_cid_relay(int n){ unsigned char rv; rv = get_register(0xf0) | 0x80; set_register (0xf0, rv); rv = get_register(0xf3) & 0x7f; set_register (0xf3, rv); rv = get_register(0xf2); if (n == 1) rv &= 0x7f; else rv |= 0x80; set_register (0xf2, rv);}voidset_dsvd_relay(int n){ unsigned char rv; rv = get_register(0xf0) | 0x8; set_register (0xf0, rv); rv = get_register(0xf3) & 0xf7; set_register (0xf3, rv); rv = get_register(0xf2); if (n == 1) rv &= 0xf7; else rv |= 0x8; set_register (0xf2, rv);}voidset_spk_hs_relay(int n){ unsigned char rv; rv = get_register(0xf0) | 0x10; set_register (0xf0, rv); rv = get_register(0xf3) & 0xef; set_register (0xf3, rv); rv = get_register(0xf2); if (n == 1) rv &= 0xef; else rv |= 0x10; set_register (0xf2, rv);}int get_hook_relay(void){ return (~get_register(0xf2) >> 2) & 0x1;}int get_voice_relay(void){ return (~get_register(0xf2) >> 6) & 0x1;}int get_cid_relay (void){ return (~get_register(0xf2) >> 7) & 0x1;}int get_dsvd_relay (void){ return (~get_register(0xf2) >> 3) & 0x1;}int get_phone_relay (void){ return (~ReadFromDsp (0x69) >> 1) & 0x1;}int get_spk_hs_relay (void){ return (~get_register(0xf2) >> 4) & 0x1;}/* ********************************************** */voiddspdrv_PutCRAM (unsigned char *data){ unsigned char l1, l2 ,i; l1 = data[2] + 4; if (l1 & 0x1) l1++; l2 = 1; if (l1 > 1) { i = 1; do { set_register (l2 + 0x40, data[i++]); l2++; } while (l2 < l1); } set_register (0x40, data[0]); set_register (0xfe, 1);}unsigned chardspdrv_GetCRAM (unsigned char *data){ unsigned char l1, l2 ,ret; int x; data[0] = ret = get_register (0x0); data[1] = get_register (0x1); data[2] = l1 = get_register (0x2); data[3] = get_register (0x3); l2 = 4; if (l1 > 0x3c) l1 = 0x3c; if (l1) { x = 4; do { data[x++] = get_register (l2++); l1--; } while (l1 > 0); } set_register (0x0, 0); set_register (0xfe, 1); return ret;}voiddspdrv_WriteCram (int ireg, volatile unsigned char *data, int count){ while (count) { set_register (ireg++, *data); data++; count--; }}voiddspdrv_ReadCram (int ireg, volatile unsigned char *data, int count){ while (count) { *data = get_register (ireg++); data++; count--; }}voidWriteToDsp (unsigned short p1, unsigned short p2){ current_command[1] = 0; current_command[3] = 0; current_command[4] = p1 & 0xff; current_command[6] = 0; current_command[7] = 0; ack_or_response = 2; current_command[0] = 0xc; current_command[2] = 0x6; current_command[5] = (p1>>8) & 0xff; current_command[8] = p2 & 0xff; current_command[9] = (p2>>8) & 0xff; send_pkt_to_dsp ();}unsigned shortReadFromDsp (unsigned short p1){ current_command[0] = 0x9; current_command[1] = 0; current_command[2] = 0x4; current_command[3] = 0; current_command[4] = p1 & 0xff; current_command[5] = (p1>>8) & 0xff; current_command[6] = 0; current_command[7] = 0; current_command[8] = 0; ack_or_response = 1; send_pkt_to_dsp (); return (dsp_response_data[1]<<8) | dsp_response_data[0];}intcp_dsp(void){ int i = 0x32; dsp_done = 0; while (1) { _dsp_timer = 2; while (_dsp_timer) { if (get_register (0x40)) continue; dspdrv_PutCRAM (current_command); return 1; } i--; if (i == 0) { /* fatal_error(0x4e464, 0x4fb); */ return -1; } }}intdsp_cp(void){ int cnt; int i = 0x32; while (1) { _dsp_timer = 2; while (_dsp_timer) { if (dsp_done == 1) { int x; cnt = Cdata[2]; for (x=0; x < cnt; x++) dsp_response_data[x] = Cdata[4+x]; return 1; } } i--; if (i == 0) { /* fatal_error(0x4e4dc, 0x522); */ return -1; } }}voidsend_pkt_to_dsp(void){ int i; _dsp_timer = 0x64; if (current_command[2] % 2) current_command[2]++; while (1) { if (_dsp_timer) { /* process_timers (); */ if (cp_dsp() != 1) continue; if (_dsp_timer) break; } break; } if (ack_or_response != 2) { _dsp_timer = 0x64; do { if (_dsp_timer == 0) break; /* process_timers (); */ } while ( dsp_cp() != 1); } /* Clear command buffer */ for (i=4; i < 40; i++) current_command[i] = 0; /* update_modem_status(); */}/*******************************************************/voidon_hook(void){ if (hook == 0) { hook = 1; set_hook_relay(0); set_speaker(0); }}voidoff_hook(void){ if (hook) { hook = 0; set_hook_relay(1); }}/********************************************************/voiddsp_info () { unsigned char al = get_register (0xf6); if (al & 0x1) Msg("DSP Code Location : Internal ROM\n"); else Msg("DSP Code Location : External SRAM\n");}/************************************************************/voidset_speaker(int n){ char svol, x; if (n == 1) { svol = spkr_volume_level; spkr_on = 1; } else { spkr_on = 0; svol = 0; } current_command[0] = 0x81; current_command[1] = 0; current_command[2] = 2; current_command[3] = 0; current_command[4] = svol; current_command[5] = 0; ack_or_response = 0; send_pkt_to_dsp (); current_command[0] = 0xa; current_command[1] = 0; current_command[2] = 2; current_command[3] = 0; current_command[4] = 0x33; current_command[5] = 0; ack_or_response = 1; send_pkt_to_dsp (); x = dsp_response_data[1] & 0xc3; if (spkr_on) { if (spkr_volume_level <= 1) x |= 0x34; else if ((spkr_volume_level==2) || (spkr_volume_level != 3)) x|=0x38; else x |= 0x3c; } else x |= 0x30; current_command[0] = 0xd; current_command[1] = 0; current_command[2] = 4; current_command[3] = 0; current_command[4] = 0x33; current_command[5] = 0; current_command[6] = 0; current_command[7] = x; current_command[0xb] = 0; ack_or_response = 2; send_pkt_to_dsp ();}voidset_volume(int n){ char x; if (n == 0) n = 1; spkr_volume_level = n; if (!spkr_on) return; current_command[0] = 0x81; current_command[1] = 0; current_command[2] = 2; current_command[3] = 0; current_command[4] = n; current_command[5] = 0; ack_or_response = 0; send_pkt_to_dsp (); current_command[0] = 0xa; current_command[1] = 0; current_command[2] = 2; current_command[3] = 0; current_command[4] = 0x33; current_command[5] = 0; ack_or_response = 1; send_pkt_to_dsp (); x = dsp_response_data[1] & 0xc3; if (spkr_volume_level <= 1) x |= 0x34; else if ((spkr_volume_level==2) || (spkr_volume_level != 3)) x|=0x38; else x |= 0x3c; current_command[0] = 0xd; current_command[1] = 0; current_command[2] = 4; current_command[3] = 0; current_command[4] = 0x33; current_command[5] = 0; current_command[6] = 0; current_command[7] = x; current_command[0xb] = 0; ack_or_response = 2; send_pkt_to_dsp ();}voidmodem_config_dial(char t1, char t2, char pd, short p4){ current_command[0] = 0x66; current_command[1] = 0; current_command[2] = 6; current_command[3] = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -