2009年9月2日星期三

wctdm.c中 fxo hook侦测分析

wctdm.c中 fxo hook侦测分析







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