⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clm_dspdrv.c

📁 这个才是朗讯的内置猫驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
	    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 + -