📄 em8xxx_voip_new.c
字号:
} 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 + -