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

📄 em8xxx_voip_new.c

📁 Sigma SMP8634 Mrua v. 2.8.2.0
💻 C
📖 第 1 页 / 共 4 页
字号:
		}		else {			RMDBGLOG((LOCALDBG,"CidGen Stop Command acknoledged rc = %d\n",rc));		}		command = VoipCodec_Command_Decoder_Start;		EM8XXXVOIPSP(pE,VoipCodec,RMVoipCodecPropertyID_Command,&command,sizeof(command));		rc = kc_interruptible_sleep_on_timeout(pV->command_q,US_TO_JIFFIES(VOIP_EVENT_TIMEOUT_US));		if (rc == 0) {			RMDBGLOG((LOCALDBG,"Timeout while waiting for Decoder Start Command Completion\n"));			return RM_PENDING;		}		else if (kc_signal_pending_current()) {			RMDBGLOG((LOCALDBG,"Interrupted while waiting for Decoder Start Command Completion\n"));			return RM_PENDING;		}		else {			RMDBGLOG((LOCALDBG,"Decoder Start Command acknoledged rc = %d\n",rc));		}		break;	case PHONE_PLAY_STOP:		RMDBGLOG((LOCALDBG,"PHONE_PLAY_STOP \n"));		command = VoipCodec_Command_Decoder_Stop;		EM8XXXVOIPSP(pE,VoipCodec,RMVoipCodecPropertyID_Command,&command,sizeof(command));		rc = kc_interruptible_sleep_on_timeout(pV->command_q,US_TO_JIFFIES(VOIP_EVENT_TIMEOUT_US));		if (rc == 0) {			RMDBGLOG((LOCALDBG,"Timeout while waiting for Decoder Stop Command Completion\n"));			return RM_PENDING;		}		else if (kc_signal_pending_current()) {			RMDBGLOG((LOCALDBG,"Interrupted while waiting for Decoder Stop Command Completion\n"));			return RM_PENDING;		}		else {			RMDBGLOG((LOCALDBG,"Decoder Stop Command acknoledged rc = %d\n",rc));		}		command = VoipCodec_Command_ToneGen_Stop;		EM8XXXVOIPSP(pE,VoipCodec,RMVoipCodecPropertyID_Command,&command,sizeof(command));		rc = kc_interruptible_sleep_on_timeout(pV->command_q,US_TO_JIFFIES(VOIP_EVENT_TIMEOUT_US));		if (rc == 0) {			RMDBGLOG((LOCALDBG,"Timeout while waiting for ToneGen Stop Command Completion\n"));			return RM_PENDING;		}		else if (kc_signal_pending_current()) {			RMDBGLOG((LOCALDBG,"Interrupted while waiting for ToneGen Stop Command Completion\n"));			return RM_PENDING;		}		else {			RMDBGLOG((LOCALDBG,"ToneGen Stop Command acknoledged rc = %d\n",rc));		}		break;	case PHONE_PLAY_DEPTH:		RMDBGLOG((LOCALDBG,"PHONE_PLAY_DEPTH \n"));		break;	case PHONE_PLAY_VOLUME:		RMDBGLOG((LOCALDBG,"PHONE_PLAY_VOLUME \n"));		break;	case PHONE_PLAY_VOLUME_LINEAR:		RMDBGLOG((LOCALDBG,"PHONE_PLAY_VOLUME_LINEAR \n"));		break;	case PHONE_PLAY_LEVEL:		RMDBGLOG((LOCALDBG,"PHONE_PLAY_LEVEL \n"));		break;	case PHONE_MAXRINGS:   /* this ioctl is superseeded, and not relevant.*/		RMDBGLOG((LOCALDBG,"PHONE_MAXRINGS \n"));		break;	case PHONE_SET_TONE_ON_TIME:		RMDBGLOG((LOCALDBG,"PHONE_SET_TONE_ON_TIME \n"));		break;	case PHONE_SET_TONE_OFF_TIME:		RMDBGLOG((LOCALDBG,"PHONE_SET_TONE_OFF_TIME \n"));		break;	case PHONE_GET_TONE_ON_TIME:		RMDBGLOG((LOCALDBG,"PHONE_GET_TONE_ON_TIME \n"));		break;	case PHONE_GET_TONE_OFF_TIME:		RMDBGLOG((LOCALDBG,"PHONE_GET_TONE_OFF_TIME \n"));		break;	case PHONE_PLAY_TONE:		RMDBGLOG((LOCALDBG,"PHONE_PLAY_TONE \n"));		break;	case PHONE_GET_TONE_STATE:		RMDBGLOG((LOCALDBG,"PHONE_GET_TONE_STATE \n"));		break;	case PHONE_GET_DTMF:		RMDBGLOG((LOCALDBG,"PHONE_GET_DTMF \n"));		break;	case PHONE_GET_DTMF_ASCII:		RMDBGLOG((LOCALDBG,"PHONE_GET_DTMF_ASCII \n"));		EM8XXXVOIPGP(pE,VoipCodec,RMVoipCodecPropertyID_DTMF_Ascii,&dtmf_ascii,sizeof(dtmf_ascii));		retval = dtmf_ascii;		RMDBGLOG((LOCALDBG,"returns ascii character %c \n",retval));		break;	case PHONE_DTMF_OOB:		RMDBGLOG((LOCALDBG,"PHONE_DTMF_OOB \n"));		break;	case PHONE_DIALTONE:		RMDBGLOG((LOCALDBG,"PHONE_DIALTONE \n"));		tg.freq1 = 440;		tg.freq2 = 0;		tg.time_on = 8000;		tg.time_off = 0;		tg.level = 2;		tg.ring = 0;		EM8XXXVOIPSP(pE,VoipCodec,RMVoipCodecPropertyID_Tone_parameters,&tg,sizeof(tg));				command = VoipCodec_Command_ToneGen_Init;		EM8XXXVOIPSP(pE,VoipCodec,RMVoipCodecPropertyID_Command,&command,sizeof(command));		rc = kc_interruptible_sleep_on_timeout(pV->command_q,US_TO_JIFFIES(VOIP_EVENT_TIMEOUT_US));		if (rc == 0) {			RMDBGLOG((LOCALDBG,"Timeout while waiting for ToneGen Init Command Completion\n"));			return RM_PENDING;		}		else if (kc_signal_pending_current()) {			RMDBGLOG((LOCALDBG,"Interrupted while waiting for ToneGen Init Command Completion\n"));			return RM_PENDING;		}		else {			RMDBGLOG((LOCALDBG,"ToneGen Init Command acknoledged rc = %d\n",rc));		}		command = VoipCodec_Command_ToneGen_Start;		EM8XXXVOIPSP(pE,VoipCodec,RMVoipCodecPropertyID_Command,&command,sizeof(command));		rc = kc_interruptible_sleep_on_timeout(pV->command_q,US_TO_JIFFIES(VOIP_EVENT_TIMEOUT_US));		if (rc == 0) {			RMDBGLOG((LOCALDBG,"Timeout while waiting for ToneGen Start Command Completion\n"));			return RM_PENDING;		}		else if (kc_signal_pending_current()) {			RMDBGLOG((LOCALDBG,"Interrupted while waiting for ToneGen Start Command Completion\n"));			return RM_PENDING;		}		else {			RMDBGLOG((LOCALDBG,"ToneGen Start Command acknoledged rc = %d\n",rc));		}		break;	case PHONE_BUSY:		RMDBGLOG((LOCALDBG,"PHONE_BUSY \n"));		tg.freq1 = 440;		tg.freq2 = 0;		tg.time_on = 4000;		tg.time_off = 4000;		tg.level = 2;		tg.ring = 0;		EM8XXXVOIPSP(pE,VoipCodec,RMVoipCodecPropertyID_Tone_parameters,&tg,sizeof(tg));				command = VoipCodec_Command_ToneGen_Init;		EM8XXXVOIPSP(pE,VoipCodec,RMVoipCodecPropertyID_Command,&command,sizeof(command));		rc = kc_interruptible_sleep_on_timeout(pV->command_q,US_TO_JIFFIES(VOIP_EVENT_TIMEOUT_US));		if (rc == 0) {			RMDBGLOG((LOCALDBG,"Timeout while waiting for ToneGen Init Command Completion\n"));			return RM_PENDING;		}		else if (kc_signal_pending_current()) {			RMDBGLOG((LOCALDBG,"Interrupted while waiting for ToneGen Init Command Completion\n"));			return RM_PENDING;		}		else {			RMDBGLOG((LOCALDBG,"ToneGen Init Command acknoledged rc = %d\n",rc));		}		command = VoipCodec_Command_ToneGen_Start;		EM8XXXVOIPSP(pE,VoipCodec,RMVoipCodecPropertyID_Command,&command,sizeof(command));		rc = kc_interruptible_sleep_on_timeout(pV->command_q,US_TO_JIFFIES(VOIP_EVENT_TIMEOUT_US));		if (rc == 0) {			RMDBGLOG((LOCALDBG,"Timeout while waiting for ToneGen Start Command Completion\n"));			return RM_PENDING;		}		else if (kc_signal_pending_current()) {			RMDBGLOG((LOCALDBG,"Interrupted while waiting for ToneGen Start Command Completion\n"));			return RM_PENDING;		}		else {			RMDBGLOG((LOCALDBG,"ToneGen Start Command acknoledged rc = %d\n",rc));		}		break;	case PHONE_RINGBACK:		RMDBGLOG((LOCALDBG,"PHONE_RINGBACK \n"));		tg.freq1 = 400;		tg.freq2 = 0;		tg.time_on = 13200;		tg.time_off = 26800;		tg.level = 2;		tg.ring = 0;		EM8XXXVOIPSP(pE,VoipCodec,RMVoipCodecPropertyID_Tone_parameters,&tg,sizeof(tg));				command = VoipCodec_Command_ToneGen_Init;		EM8XXXVOIPSP(pE,VoipCodec,RMVoipCodecPropertyID_Command,&command,sizeof(command));		rc = kc_interruptible_sleep_on_timeout(pV->command_q,US_TO_JIFFIES(VOIP_EVENT_TIMEOUT_US));		if (rc == 0) {			RMDBGLOG((LOCALDBG,"Timeout while waiting for ToneGen Init Command Completion\n"));			return RM_PENDING;		}		else if (kc_signal_pending_current()) {			RMDBGLOG((LOCALDBG,"Interrupted while waiting for ToneGen Init Command Completion\n"));			return RM_PENDING;		}		else {			RMDBGLOG((LOCALDBG,"ToneGen Init Command acknoledged rc = %d\n",rc));		}		command = VoipCodec_Command_ToneGen_Start;		EM8XXXVOIPSP(pE,VoipCodec,RMVoipCodecPropertyID_Command,&command,sizeof(command));		rc = kc_interruptible_sleep_on_timeout(pV->command_q,US_TO_JIFFIES(VOIP_EVENT_TIMEOUT_US));		if (rc == 0) {			RMDBGLOG((LOCALDBG,"Timeout while waiting for ToneGen Start Command Completion\n"));			return RM_PENDING;		}		else if (kc_signal_pending_current()) {			RMDBGLOG((LOCALDBG,"Interrupted while waiting for ToneGen Start Command Completion\n"));			return RM_PENDING;		}		else {			RMDBGLOG((LOCALDBG,"ToneGen Start Command acknoledged rc = %d\n",rc));		}		break;	case PHONE_WINK:		RMDBGLOG((LOCALDBG,"PHONE_WINK \n"));		break;	case PHONE_CPT_STOP:		RMDBGLOG((LOCALDBG,"PHONE_CPT_STOP \n"));		break;	case PHONE_QUERY_CODEC:		RMDBGLOG((LOCALDBG,"PHONE_QUERY_CODEC \n"));		break;	case PHONE_CAPABILITIES:		RMDBGLOG((LOCALDBG,"PHONE_CAPABILITIES \n"));		break;	case PHONE_CAPABILITIES_LIST:		RMDBGLOG((LOCALDBG,"PHONE_CAPABILITIES_LIST \n"));		break;	case PHONE_CAPABILITIES_CHECK:		RMDBGLOG((LOCALDBG,"PHONE_CAPABILITIES_CHECK \n"));		return 1;		break;	case PHONE_PSTN_SET_STATE:		RMDBGLOG((LOCALDBG,"PHONE_PSTN_SET_STATE \n"));		switch(arg){		case PSTN_ON_HOOK:			break;		case PSTN_RINGING:			break;		case PSTN_OFF_HOOK:			break;		case PSTN_PULSE_DIAL:			break;		}		break;	case PHONE_PSTN_GET_STATE:		RMDBGLOG((LOCALDBG,"PHONE_PSTN_GET_STATE \n"));		break;	}	return retval;}static int em8xxx_voip_fasync(int fd, struct file *file_p, int mode){	struct voipprivate *pV = file_p->private_data;	return fasync_helper(fd, file_p, mode, &pV->async_queue);}static int em8xxx_voip_release(struct inode *inode, struct file *file_p){	struct voipprivate *pV = (struct voipprivate *) file_p->private_data;	struct em8xxxprivate *pE = Etable + (pV - VOIPtable);	enum VoipCodec_Command_type command;	RMstatus err;	int rc;	pV->voip_open_count --;	pV->exc.bytes = 0;	file_p->private_data = NULL;		command = VoipCodec_Command_DTMF_Stop;	EM8XXXVOIPSP(pE,VoipCodec,RMVoipCodecPropertyID_Command,&command,sizeof(command));	rc = kc_interruptible_sleep_on_timeout(pV->command_q,US_TO_JIFFIES(VOIP_EVENT_TIMEOUT_US));	if (rc == 0) {		RMDBGLOG((LOCALDBG,"Timeout while waiting for DTMF Stop Command Completion\n"));		return RM_PENDING;	}	else if (kc_signal_pending_current()) {		RMDBGLOG((LOCALDBG,"Interrupted while waiting for DTMF Stop Command Completion\n"));		return RM_PENDING;	}	else {		RMDBGLOG((LOCALDBG,"DTMF Stop Command acknoledged rc = %d\n",rc));	}	return 0;}static int em8xxx_voip_init(struct em8xxxprivate *pE){	struct voipprivate *pV=VOIPtable+(pE-Etable);	RMuint32 mask = SOFT_IRQ_EVENT_COMMANDCOMPLETION |			SOFT_IRQ_EVENT_VOIP_DTMF_READY |			SOFT_IRQ_EVENT_VOIP_FRAME_ENCODED | 			SOFT_IRQ_EVENT_VOIP_FRAME_DECODED;	if (pV->voip_active == 0) {		memset(pV,0,sizeof(struct voipprivate));		/* Register with the Telephony for Linux subsystem */		pV->p_dev.f_op = &em8xxx_voip_fops;		pV->p_dev.open = em8xxx_voip_open;		pV->p_dev.board = pE-Etable;		phone_register_device(&pV->p_dev, PHONE_UNIT_ANY);	}	else {		RMDBGLOG((LOCALDBG,"Em8xxx Voip Driver already registered ! \n"));		return -EINVAL;	}	pV->voip_active = 1;	kc_init_waitqueue_head(&pV->command_q);	kc_init_waitqueue_head(&pV->poll_q);	kc_init_waitqueue_head(&pV->read_q);	kc_init_waitqueue_head(&pV->write_q);	tasklet_init(&pV->event_tq,em8xxx_voip_clear_event_mask,(unsigned long) pV);	krua_register_event_callback(pE,VoipCodec,mask,em8xxx_voip_event_callback);	init_gpio(pE);	init_voip(pV);	SlicSetState(pV,NORMAL_ACTIVE);	pV->check_interval = HZ / DEFAULT_CHECK_FREQ;		em8xxx_voip_init_timer(pV);	em8xxx_voip_add_timer(pV);	RMDBGLOG((ENABLE,"Em8xxx Voip driver registered\n"));	return 0;}static int em8xxx_voip_cleanup(struct em8xxxprivate *pE){	struct voipprivate *pV=VOIPtable+(pE-Etable);	cleanup_voip(pV);	del_timer(&pV->timer);	kc_deinit_waitqueue_head(pV->command_q);	kc_deinit_waitqueue_head(pV->poll_q);	kc_deinit_waitqueue_head(pV->read_q);	kc_deinit_waitqueue_head(pV->write_q);	krua_unregister_event_callback(pE,VoipCodec,em8xxx_voip_event_callback);	tasklet_kill(&pV->event_tq);	if (pV->voip_active == 1) {		if (pV->voip_open_count == 0) {			phone_unregister_device(&pV->p_dev);		}		else {			RMDBGLOG((LOCALDBG,"Cannot unregister telephony driver, device is opened \n"));			return -EINVAL;		}	}	else {		RMDBGLOG((LOCALDBG,"No Voip device registered\n"));		return -EINVAL;	}	RMDBGLOG((LOCALDBG,"Em8xxx Voip Driver unregistered\n"));	pV->voip_active = 0;	return 0;}int init_module(void){	int i,enabled_count=0;	for (i=0;i<MAXLLAD;i++) {		if (&((&Etable[i])->pllad) != NULL) {			if (Etable[i].pllad != NULL) {				if (em8xxx_voip_init(&Etable[i]) != 0)					return -EINVAL;				enabled_count ++;			}		}	}	if (((&Etable[0])->pllad != NULL) && (enabled_count == 0)) {		RMDBGLOG((LOCALDBG,"Default behaviour, enabling Voip on device #0\n"));		if (em8xxx_voip_init(&Etable[0]) != 0)			return -EINVAL;	}	return 0;}void cleanup_module(void){	int i;	RMDBGLOG((LOCALDBG,"Removing voip module\n"));	for (i=0;i<MAXLLAD;i++) {		if (VOIPtable[i].voip_active) {			em8xxx_voip_cleanup(&Etable[i]);		}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -