Update of /usr/cvsroot/zaptel
In directory mongoose.digium.com:/tmp/cvs-serv2799

Modified Files:
        wctdm.c 
Log Message:
Allow polarity on TDM card FXS interface to be reversed...


Index: wctdm.c
===================================================================
RCS file: /usr/cvsroot/zaptel/wctdm.c,v
retrieving revision 1.121
retrieving revision 1.122
diff -u -d -r1.121 -r1.122
--- wctdm.c     27 Jul 2005 22:26:55 -0000      1.121
+++ wctdm.c     4 Aug 2005 20:33:33 -0000       1.122
@@ -55,6 +55,8 @@
 */
 static int loopcurrent = 20;
 
+static int reversepolarity = 0;
+
 static alpha  indirect_regs[] =
 {
 {0,255,"DTMF_ROW_0_PEAK",0x55C2},
@@ -1058,15 +1060,24 @@
                        if (wc->mod[x].fxs.lasttxhook == 0x4) {
                                /* RINGing, prepare for OHT */
                                wc->mod[x].fxs.ohttimer = OHT_TIMER << 3;
-                               wc->mod[x].fxs.idletxhookstate = 0x2;   /* OHT 
mode when idle */
+                               if (reversepolarity)
+                                       wc->mod[x].fxs.idletxhookstate = 0x6;   
/* OHT mode when idle */
+                               else
+                                       wc->mod[x].fxs.idletxhookstate = 0x2; 
                        } else {
                                if (wc->mod[x].fxs.ohttimer) {
                                        wc->mod[x].fxs.ohttimer-= ZT_CHUNKSIZE;
                                        if (!wc->mod[x].fxs.ohttimer) {
-                                               wc->mod[x].fxs.idletxhookstate 
= 0x1;   /* Switch to active */
-                                               if (wc->mod[x].fxs.lasttxhook 
== 0x2) {
+                                               if (reversepolarity)
+                                                       
wc->mod[x].fxs.idletxhookstate = 0x5;   /* Switch to active */
+                                               else
+                                                       
wc->mod[x].fxs.idletxhookstate = 0x1;
+                                               if ((wc->mod[x].fxs.lasttxhook 
== 0x2) || (wc->mod[x].fxs.lasttxhook = 0x6)) {
                                                        /* Apply the change if 
appropriate */
-                                                       
wc->mod[x].fxs.lasttxhook = 0x1;
+                                                       if (reversepolarity) 
+                                                               
wc->mod[x].fxs.lasttxhook = 0x5;
+                                                       else
+                                                               
wc->mod[x].fxs.lasttxhook = 0x1;
                                                        wctdm_setreg(wc, x, 64, 
wc->mod[x].fxs.lasttxhook);
                                                }
                                        }
@@ -1474,7 +1485,10 @@
        int fxsmode=0;
 
        /* By default, don't send on hook */
-       wc->mod[card].fxs.idletxhookstate  = 1;
+       if (reversepolarity)
+               wc->mod[card].fxs.idletxhookstate = 5;
+       else
+               wc->mod[card].fxs.idletxhookstate = 1;
 
        /* Sanity check the ProSLIC */
        if (!sane && wctdm_proslic_insane(wc, card))
@@ -1662,10 +1676,16 @@
                if (get_user(x, (int *)data))
                        return -EFAULT;
                wc->mod[chan->chanpos - 1].fxs.ohttimer = x << 3;
-               wc->mod[chan->chanpos - 1].fxs.idletxhookstate = 0x2;   /* OHT 
mode when idle */
+               if (reversepolarity)
+                       wc->mod[chan->chanpos - 1].fxs.idletxhookstate = 0x6;   
/* OHT mode when idle */
+               else
+                       wc->mod[chan->chanpos - 1].fxs.idletxhookstate = 0x2;
                if (wc->mod[chan->chanpos - 1].fxs.lasttxhook == 0x1) {
                                /* Apply the change if appropriate */
-                               wc->mod[chan->chanpos - 1].fxs.lasttxhook = 0x2;
+                               if (reversepolarity)
+                                       wc->mod[chan->chanpos - 
1].fxs.lasttxhook = 0x6;
+                               else
+                                       wc->mod[chan->chanpos - 
1].fxs.lasttxhook = 0x2;
                                wctdm_setreg(wc, chan->chanpos - 1, 64, 
wc->mod[chan->chanpos - 1].fxs.lasttxhook);
                }
                break;
@@ -1679,7 +1699,7 @@
                    (wc->mod[chan->chanpos -1 ].fxs.lasttxhook == 0x00))
                        return -EINVAL;
 
-               if (x)
+               if ((x && !reversepolarity) || (!x && reversepolarity))
                        wc->mod[chan->chanpos - 1].fxs.lasttxhook |= 0x04;
                else
                        wc->mod[chan->chanpos - 1].fxs.lasttxhook &= ~0x04;
@@ -1793,9 +1813,12 @@
 #else
        module_put(THIS_MODULE);
 #endif
-       if (wc->modtype[chan->chanpos - 1] == MOD_TYPE_FXS)
-               wc->mod[chan->chanpos -  1].fxs.idletxhookstate = 1;
-
+       if (wc->modtype[chan->chanpos - 1] == MOD_TYPE_FXS) {
+               if (reversepolarity)
+                       wc->mod[chan->chanpos - 1].fxs.idletxhookstate = 5;
+               else
+                       wc->mod[chan->chanpos - 1].fxs.idletxhookstate = 1;
+       }
        /* If we're dead, release us now */
        if (!wc->usecount && wc->dead) 
                wctdm_release(wc);
@@ -2313,6 +2336,7 @@
 #ifdef LINUX26
 module_param(debug, int, 0600);
 module_param(loopcurrent, int, 0600);
+module_param(reversepolarity, int, 0600);
 module_param(robust, int, 0600);
 module_param(_opermode, int, 0600);
 module_param(opermode, charp, 0600);
@@ -2326,6 +2350,7 @@
 #else
 MODULE_PARM(debug, "i");
 MODULE_PARM(loopcurrent, "i");
+MODULE_PARM(reversepolarity, "i");
 MODULE_PARM(robust, "i");
 MODULE_PARM(_opermode, "i");
 MODULE_PARM(opermode, "s");

_______________________________________________
Asterisk-Cvs mailing list
[email protected]
http://lists.digium.com/mailman/listinfo/asterisk-cvs

Reply via email to