| 1、wctdm_voicedaa_check_hook 函数用于侦测fxo的hook 和电压
 | 
 
 | 1、读取si300的reg5 进行hook侦测  reg29进行电压判断
 1.1 reg5 如果onhook赋值为0x8  如果offhook赋值为0x9
 1.2 如果offhook 才会进行hook 判断
 
 判断reg5的第5和6位(如果有振铃这两位中的一个会被置1)
 有振铃产生切电压值也是高的则ringdebounce递增,增加到设定值时(默认是4个循环)表示振铃真正产生,而不是干扰。这时channel的
 rxhooksig设为DAHDI_RXSIG_RING。
 判断reg5,如果没有振铃置位,ringdebounce就会递减,减到0时表示振铃消失,如果先前处于ring状态,则更新channel的rxhooksig为DAHDI_RXSIG_OFFHOOK。
 1.3 电压判断
 读取reg29的值即电压值。(中国的电压我读出来的是-104V)
 
 如果该值绝对值小于3V,表示该fxo没有插入电话线 即没有被供电。当然为了避免扰动battdebouce值会从设定值递减 减为0时
 表示真正的被拔掉了电话线,fxo->battery =
 BATTERY_LOST置channel状态为DAHDI_RXSIG_ONHOOK,设定battalarm时间。
 
 否则如果电压值大于3v表示该fxo口被供电了,同样状态的改变需要battdebounce从设定值递减为0,来确认是持续的状态而不是干扰,状态确
 认后fxo->battery = BATTERY_PRESENT;
 设定channel状态了DAHDI_RXSIG_OFFHOOK。设定battalarm时间
 1.4 alarm信息通知
 当alarm递减为0时执行
 dahdi_alarm_channel(wc->chans[card], fxo->battery == BATTERY_LOST ? DAHDI_ALARM_RED : DAHDI_ALARM_NONE);
 
 1.5 电压反转事件
 当polaritydebounce减为0时,发送翻转事件
 dahdi_qevent_lock(wc->chans[card], DAHDI_EVENT_POLARITY);
 | 
 
 | 2、dahdi_receive() 函数进行ring信号的确认 和传递 ,传给asterisk
 该函数会侦测每个channel 来进行处理。
 如果使用ringdebtimer 则需要ringdebtimer从设定值减为0 才会发送DAHDI_EVENT_RINGOFFHOOK 事件通知asterisk来处里。好像只有GS信令才需要。
 
 
 当channel状态改为DAHDI_RXSIG_RING时,会设定ringtrailer为一个数值DAHDI_RINGTRAILER默认是
 (50×8).当channel不处于DAHDI_RXSIG_RING时,ringtrailer会递减,当为1时,
 __qevent(span->chans[x],DAHDI_EVENT_RINGOFFHOOK);
 向asterisk传送event事件通知有ring需要off hook。
 
 
 | 
 
 | 3、otimer itimer 计时器 当这些值为0时 将进行相应的动作。
 | 
 | 
没有评论:
发表评论