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

Modified Files:
        zaptel.h pciradio.c 
Log Message:
Added driver support for UART output in VHDL on each channel


Index: zaptel.h
===================================================================
RCS file: /usr/cvsroot/zaptel/zaptel.h,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -d -r1.43 -r1.44
--- zaptel.h    11 May 2005 23:43:11 -0000      1.43
+++ zaptel.h    11 Aug 2005 03:19:46 -0000      1.44
@@ -1492,11 +1492,14 @@
        unsigned char radstat;          /* status bits of radio */
 };
 
+#define        RAD_SERIAL_BUFLEN 128
+
 struct zt_radio_param {
        unsigned short radpar;  /* param identifier */
        unsigned short index;   /* tone number */
        int data;               /* param */
        int data2;              /* param 2 */
+       unsigned char buf[RAD_SERIAL_BUFLEN];
 };
 
 
@@ -1557,7 +1560,9 @@
 
 #define        ZT_RADPAR_REMMODE 16    /* Remote control data mode */
        #define ZT_RADPAR_REM_NONE 0    /* no remote control data mode */
-       #define ZT_RADPAR_REM_RBI1 1    /* Doug Hall RBI-1 data mode */         
                   
+       #define ZT_RADPAR_REM_RBI1 1    /* Doug Hall RBI-1 data mode */
+       #define ZT_RADPAR_REM_SERIAL 2  /* Serial Data, 9600 BPS */
+       #define ZT_RADPAR_REM_SERIAL_ASCII 3    /* Serial Ascii Data, 9600 BPS 
*/
 
 #define        ZT_RADPAR_REMCOMMAND 17 /* Remote conrtol write data block & do 
cmd */
 

Index: pciradio.c
===================================================================
RCS file: /usr/cvsroot/zaptel/pciradio.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- pciradio.c  25 Jul 2005 18:30:55 -0000      1.12
+++ pciradio.c  11 Aug 2005 03:19:46 -0000      1.13
@@ -63,6 +63,10 @@
 
 #define        NUM_CODES 15
 
+#define        SERIAL_BUFLEN 128
+
+#define        SRX_TIMEOUT 300
+
 #define RAD_CNTL       0x00
 #define RAD_OPER       0x01
 #define RAD_AUXC       0x02
@@ -149,7 +153,13 @@
        int freeregion;
        int nchans;
        spinlock_t lock;
-       spinlock_t rbilock;
+       spinlock_t remotelock;
+       unsigned char rxbuf[SERIAL_BUFLEN];
+       unsigned short rxindex;
+       unsigned long srxtimer;
+       unsigned char txbuf[SERIAL_BUFLEN];
+       unsigned short txindex;
+       unsigned short txlen;
        unsigned char pasave;
        unsigned char pfsave;
        volatile unsigned long ioaddr;
@@ -464,7 +474,7 @@
 DECLARE_WAIT_QUEUE_HEAD(mywait);
 
 
-       spin_lock(&rad->rbilock);
+       spin_lock(&rad->remotelock);
        while(__pciradio_getcreg(rad,0xc) & 2) 
interruptible_sleep_on_timeout(&mywait,2);
        /* enable and address RBI serializer */
        __pciradio_setcreg(rad,0xf,rad->pfsave | (n << 4) | 0x40);
@@ -472,7 +482,7 @@
        for(x = 0; x < 5; x++) __pciradio_setcreg(rad,0xc,rbicmd[x]);
        /* output it */
        __pciradio_setcreg(rad,0xb,1);
-       spin_unlock(&rad->rbilock);
+       spin_unlock(&rad->remotelock);
        return;
 }
 
@@ -891,6 +901,28 @@
                                }
                        }
                }
+/* process serial if any */
+               /* send byte if there is one in buffer to send */
+               if (rad->txlen && (rad->txlen != rad->txindex))
+               {
+                       /* if tx not busy */
+                       if (!(__pciradio_getcreg(rad,9) & 0x80))
+                       {
+                               __pciradio_setcreg(rad, 4, 
rad->txbuf[rad->txindex++]);
+                       }                               
+               }
+               rad->srxtimer++;
+               /* if something in rx to read */
+               while(__pciradio_getcreg(rad,9) & 0x10)
+               {
+                       unsigned char c = __pciradio_getcreg(rad,4);
+                       rad->srxtimer = 0;
+                       if (rad->rxindex < RAD_SERIAL_BUFLEN)
+                       {
+                               rad->rxbuf[rad->rxindex++] = c;
+                       }
+                       udelay(1);
+               }
                pciradio_receiveprep(rad, ints);
                pciradio_transmitprep(rad, ints);
        }
@@ -1162,29 +1194,90 @@
                        rad->remmode[chan->chanpos - 1] = stack.p.data;
                        break;
                case ZT_RADPAR_REMCOMMAND:
+                       /* if no remote mode, return an error */
+                       if (rad->remmode[chan->chanpos - 1] == 
ZT_RADPAR_REM_NONE)
+                       {
+                               spin_unlock_irqrestore(&rad->lock,flags);
+                               return -EINVAL;
+                       }
                        i = 0;
+                       if (rad->remmode[chan->chanpos - 1] == 
ZT_RADPAR_REM_RBI1)
+                       {
+                               /* set UIOA and UIOB for output */
+                               spin_lock_irqsave(&rad->lock,flags);
+                               byte1 = __pciradio_getcreg(rad,0xe);
+                               mask = (1 << (chan->chanpos - 1)) | 
+                                       (1 << (chan->chanpos + 3));
+                               byte2 = byte1 & (~mask);
+                               i = (byte2 != byte1);
+                               __pciradio_setcreg(rad,0xe,byte2);
+                               byte1 = __pciradio_getcreg(rad,8);
+                               mask = 1 << (chan->chanpos - 1);
+                               byte2 = byte1 | mask;
+                               i = (byte2 != byte1);
+                               __pciradio_setcreg(rad,8,byte2);
+                               spin_unlock_irqrestore(&rad->lock,flags);
+                               if (i || (jiffies < rad->lastremcmd + 10))
+                                       
interruptible_sleep_on_timeout(&mywait,10);
+                               rad->lastremcmd = jiffies;
+                               rbi_out(rad,chan->chanpos - 1,(unsigned char 
*)&stack.p.data);
+                               break;
+                       }
                        /* set UIOA and UIOB for output */
                        spin_lock_irqsave(&rad->lock,flags);
                        byte1 = __pciradio_getcreg(rad,0xe);
-                       mask = (1 << (chan->chanpos - 1)) | 
-                               (1 << (chan->chanpos + 3));
+                       mask = 1 << (chan->chanpos + 3); /* B an output */
                        byte2 = byte1 & (~mask);
-                       i = (byte2 != byte1);
+                       byte2 |= 1 << (chan->chanpos - 1); /* A in input */
                        __pciradio_setcreg(rad,0xe,byte2);
                        byte1 = __pciradio_getcreg(rad,8);
-                       mask = 1 << (chan->chanpos - 1);
                        byte2 = byte1 | mask;
-                       i = (byte2 != byte1);
+                       byte2 |= 1 << (chan->chanpos - 1);
                        __pciradio_setcreg(rad,8,byte2);
                        spin_unlock_irqrestore(&rad->lock,flags);
-                       if (i || (jiffies < rad->lastremcmd + 10))
+                       if (byte1 != byte2)
+                               interruptible_sleep_on_timeout(&mywait,100);
+                       while (jiffies < rad->lastremcmd + 10)
                                interruptible_sleep_on_timeout(&mywait,10);
                        rad->lastremcmd = jiffies;
-                       if (rad->remmode[chan->chanpos - 1])
-                       {
-                               rbi_out(rad,chan->chanpos - 1,(unsigned char 
*)&stack.p.data);
+                       spin_lock(&rad->remotelock);
+                       while(__pciradio_getcreg(rad,0xc) & 2) 
interruptible_sleep_on_timeout(&mywait,2);
+                       spin_unlock(&rad->remotelock);
+                       spin_lock_irqsave(&rad->lock,flags);
+                       /* enable and address async serializer */
+                       __pciradio_setcreg(rad,0xf,rad->pfsave | 
((chan->chanpos - 1) << 4) | 0x80);
+                       /* copy tx buffer */
+                       memcpy(rad->txbuf,stack.p.buf,stack.p.index);
+                       rad->txlen = stack.p.index;
+                       rad->txindex = 0;
+                       rad->rxindex = 0;
+                       rad->srxtimer = 0;
+                       memset(stack.p.buf,0,SERIAL_BUFLEN);
+                       stack.p.index = 0;
+                       for(;;)
+                       {                       
+                               rad->rxbuf[rad->rxindex] = 0;
+                               if (((!stack.p.data) || (rad->rxindex < 
stack.p.data)) &&
+                                 (rad->srxtimer < SRX_TIMEOUT) &&
+                                   ((rad->remmode[chan->chanpos - 1] == 
ZT_RADPAR_REM_SERIAL) ||
+                                       (!strchr(rad->rxbuf,'\r'))))
+                               {
+                                       
spin_unlock_irqrestore(&rad->lock,flags);
+                                       
interruptible_sleep_on_timeout(&mywait,2);
+                                       spin_lock_irqsave(&rad->lock,flags);
+                                       continue;
+                               }
+                               memset(stack.p.buf,0,SERIAL_BUFLEN);
+                               if (stack.p.data && (rad->rxindex > 
stack.p.data))
+                                       rad->rxindex = stack.p.data;
+                               if (rad->rxindex)
+                                       
memcpy(stack.p.buf,rad->rxbuf,rad->rxindex);
+                               stack.p.index = rad->rxindex;
+                               break;
                        }
-                       break;
+                       if (copy_to_user((struct zt_radio_stat 
*)data,&stack.p,sizeof(struct zt_radio_param))) return -EFAULT;
+                       spin_unlock_irqrestore(&rad->lock,flags);
+                       return 0;
                default:
                        spin_unlock_irqrestore(&rad->lock,flags);
                        return -EINVAL;

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

Reply via email to