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时 将进行相应的动作。 |
|