📄 slic.c
字号:
{ rtlglue_printf("CH%d P-Meter Inactive Time out\n",channel); isr_status |= PMIP; writeDirectReg(18, isr_status, channel); } if(isr_status & PMAP) { rtlglue_printf("CH%d P-Meter Active Time out\n",channel); isr_status |= PMAP; writeDirectReg(18, isr_status, channel); } if(isr_status & RGIP) { /*rtlglue_printf("Ring!!!\n");*/ isr_status |= RGIP; writeDirectReg(18, isr_status, channel); } /* Ringing is now on!!and timer is count * Next maybe pickup the phone */ if(isr_status & RGAP) { rtlglue_printf("CH%d Ring!!\n",channel); isr_status |= RGAP; writeDirectReg(18, isr_status, channel); } if(isr_status & O2IP) { /*rtlglue_printf("Du-Du!!\n");*/ isr_status |= O2IP; writeDirectReg(18, isr_status, channel); } if(isr_status & O2AP) { rtlglue_printf("CH%d Du-Du!!\n",channel); isr_status |= O2AP; writeDirectReg(18, isr_status, channel); } if(isr_status & O1IP) { /*rtlglue_printf("Du-Du!\n");*/ isr_status |= O1IP; writeDirectReg(18, isr_status, channel); } if(isr_status & O1AP) { rtlglue_printf("CH%d Du!\n",channel); isr_status |= O1AP; writeDirectReg(18, isr_status, channel); } } return ret;}/*@ ZONE: Ringing, the functions in the following is@ only used when slic needs to ring the telephone@ Wanna ring: _slic_ring_activate@ Wanna stop: _slic_ring_stop*/void slic_ring_standard(int channel){ /* Enables ringing mode on ProSlic for standard North American ring RING_ON__LO 48 RING_ON_HI 49 RING_OFF_LO 50 RING_OFF_HI 51 Active Timer */ writeDirectReg( RING_ON__LO, 0x80, channel);/*Active timer*/ writeDirectReg( RING_ON_HI, 0x3E, channel);/*Active timer*/ writeDirectReg( RING_OFF_LO, 0x00, channel);/*InActive timer*/ writeDirectReg( RING_OFF_HI, 0x7D, channel);/*InActive timer*/ writeDirectReg( 34, 0x18, channel);}void slic_ring_activate(int channel){ writeDirectReg( 64, 0x04, channel);}void slic_ring_stop(int channel){ if ((0xf & readDirectReg(0, channel))<=2 ) /* if REVISION B */ { /* Loop Debounce Register = initial value */ writeDirectReg(69,10, channel); } writeDirectReg(64,1, channel);}/*@ ZONE: tone generation, the functions in the following is@ only used when slic generates kinds of tones*/void slic_tone_diableOSCs(int channel){#if 0 uint8 regVal; regVal = readDirectReg(32); _slic_clear_DREGBIT(regVal, 2);/*disable OSC1*/ writeDirectReg(32, regVal); regVal = readDirectReg(33); _slic_clear_DREGBIT(regVal, 2);/*disable OSC2*/ writeDirectReg(33, regVal);#endif#if 1 writeDirectReg(32, 0, channel);/*OSC1 control*/ writeDirectReg(33, 0, channel);/*OSC2 control*/ writeDirectReg(35, 0, channel);/*Pulse meter control*/ writeDirectReg(36, 0, channel);/*OAT1 Low*/ writeDirectReg(37, 0, channel);/*OAT1 High*/ writeDirectReg(38, 0, channel);/*OIT1 Low*/ writeDirectReg(39, 0, channel);/*OIT1 High*/ writeDirectReg(40, 0, channel);/*OAT2 Low*/ writeDirectReg(41, 0, channel);/*OAT2 High*/ writeDirectReg(42, 0, channel);/*OIT2 Low*/ writeDirectReg(43, 0, channel);/*OIT2 High*/ writeDirectReg(44, 0, channel);/*PAT High*/ writeDirectReg(45, 0, channel);/*PAt High*/#endif}void slic_tone_generation(tone_struct tone, int channel){ /* User function to extract values for oscillators from tone_struct place them in the registers, and enable the oscillators.*/ unsigned char osc1_ontimer_enable=0; unsigned char osc1_offtimer_enable=0; unsigned char osc2_ontimer_enable=0; unsigned char osc2_offtimer_enable=0; int enable_osc2=0; /* Make sure the oscillators are not already on. */ slic_tone_diableOSCs(channel);/* in DReg 32, 33*/ if (tone.osc1.coeff == 0 || tone.osc1.x == 0) { rtlglue_printf("You passed me a invalid struct!\n"); return; } /* Setup osc 1 */ writeIndirectReg( OSC1_COEF, tone.osc1.coeff, channel); writeIndirectReg( OSC1X, tone.osc1.x, channel); writeIndirectReg( OSC1Y, tone.osc1.y, channel); /* Active Timer */ if (tone.osc1.on_hi_byte != 0) { writeDirectReg( OSC1_ON__LO, tone.osc1.on_low_byte, channel); writeDirectReg( OSC1_ON_HI, tone.osc1.on_hi_byte, channel); osc1_ontimer_enable = 0x10; } /* Inactive Timer */ if (tone.osc1.off_hi_byte != 0) { writeDirectReg( OSC1_OFF_LO, tone.osc1.off_low_byte, channel); writeDirectReg( OSC1_OFF_HI, tone.osc1.off_hi_byte, channel); osc1_offtimer_enable = 0x08; } if (tone.osc2.coeff != 0) { /* Setup OSC 2 */ writeIndirectReg( OSC2_COEF, tone.osc2.coeff, channel); writeIndirectReg( OSC2X, tone.osc2.x, channel); writeIndirectReg( OSC2Y, tone.osc2.y, channel); /* Active Timer */ if (tone.osc1.on_hi_byte != 0) { writeDirectReg( OSC2_ON__LO, tone.osc2.on_low_byte, channel); writeDirectReg( OSC2_ON_HI, tone.osc2.on_hi_byte, channel); osc2_ontimer_enable = 0x10; } /* Inactive Timer */ if (tone.osc1.off_hi_byte != 0) { writeDirectReg( OSC2_OFF_LO, tone.osc2.off_low_byte, channel); writeDirectReg( OSC2_OFF_HI, tone.osc2.off_hi_byte, channel); osc2_offtimer_enable = 0x08; } enable_osc2 = 1; } writeDirectReg( OSC1, (unsigned char)(0x06 | osc1_ontimer_enable | osc1_offtimer_enable), channel); if (enable_osc2) writeDirectReg( OSC2, (unsigned char)(0x06 | osc2_ontimer_enable | osc2_offtimer_enable), channel); return;}void slic_tone_dial(int channel){ writeIndirectReg(13,DIALTONE_IR13, channel); writeIndirectReg(14,DIALTONE_IR14, channel); writeIndirectReg(16,DIALTONE_IR16, channel); writeIndirectReg(17,DIALTONE_IR17, channel); writeDirectReg(36, DIALTONE_DR36, channel); writeDirectReg(37, DIALTONE_DR37, channel); writeDirectReg(38, DIALTONE_DR38, channel); writeDirectReg(39, DIALTONE_DR39, channel); writeDirectReg(40, DIALTONE_DR40, channel); writeDirectReg(41, DIALTONE_DR41, channel); writeDirectReg(42, DIALTONE_DR42, channel); writeDirectReg(43, DIALTONE_DR43, channel); writeDirectReg(32, DIALTONE_DR32, channel); writeDirectReg(33, DIALTONE_DR33, channel);}void slic_tone_busy(int channel){ writeIndirectReg(13,BUSYTONE_IR13, channel); writeIndirectReg(14,BUSYTONE_IR14, channel); writeIndirectReg(16,BUSYTONE_IR16, channel); writeIndirectReg(17,BUSYTONE_IR17, channel); writeDirectReg(36, BUSYTONE_DR36, channel); writeDirectReg(37, BUSYTONE_DR37, channel); writeDirectReg(38, BUSYTONE_DR38, channel); writeDirectReg(39, BUSYTONE_DR39, channel); writeDirectReg(40, BUSYTONE_DR40, channel); writeDirectReg(41, BUSYTONE_DR41, channel); writeDirectReg(42, BUSYTONE_DR42, channel); writeDirectReg(43, BUSYTONE_DR43, channel); writeDirectReg(32, BUSYTONE_DR32, channel); writeDirectReg(33, BUSYTONE_DR33, channel);}void slic_tone_reorder(int channel){ writeIndirectReg(13,REORDERTONE_IR13, channel); writeIndirectReg(14,REORDERTONE_IR14, channel); writeIndirectReg(16,REORDERTONE_IR16, channel); writeIndirectReg(17,REORDERTONE_IR17, channel); writeDirectReg(36, REORDERTONE_DR36, channel); writeDirectReg(37, REORDERTONE_DR37, channel); writeDirectReg(38, REORDERTONE_DR38, channel); writeDirectReg(39, REORDERTONE_DR39, channel); writeDirectReg(40, REORDERTONE_DR40, channel); writeDirectReg(41, REORDERTONE_DR41, channel); writeDirectReg(42, REORDERTONE_DR42, channel); writeDirectReg(43, REORDERTONE_DR43, channel); writeDirectReg(32, REORDERTONE_DR32, channel); writeDirectReg(33, REORDERTONE_DR33, channel); }void slic_tone_congestion(int channel){ writeIndirectReg(13,CONGESTIONTONE_IR13, channel); writeIndirectReg(14,CONGESTIONTONE_IR14, channel); writeIndirectReg(16,CONGESTIONTONE_IR16, channel); writeIndirectReg(17,CONGESTIONTONE_IR17, channel); writeDirectReg(36, CONGESTIONTONE_DR36, channel); writeDirectReg(37, CONGESTIONTONE_DR37, channel); writeDirectReg(38, CONGESTIONTONE_DR38, channel); writeDirectReg(39, CONGESTIONTONE_DR39, channel); writeDirectReg(40, CONGESTIONTONE_DR40, channel); writeDirectReg(41, CONGESTIONTONE_DR41, channel); writeDirectReg(42, CONGESTIONTONE_DR42, channel); writeDirectReg(43, CONGESTIONTONE_DR43, channel); writeDirectReg(32, CONGESTIONTONE_DR32, channel); writeDirectReg(33, CONGESTIONTONE_DR33, channel);}void slic_tone_ringbackPbx(int channel){ writeIndirectReg(13,RINGBACKPBXTONE_IR13, channel); writeIndirectReg(14,RINGBACKPBXTONE_IR14, channel); writeIndirectReg(16,RINGBACKPBXTONE_IR16, channel); writeIndirectReg(17,RINGBACKPBXTONE_IR17, channel); writeDirectReg(36, RINGBACKPBXTONE_DR36, channel); writeDirectReg(37, RINGBACKPBXTONE_DR37, channel); writeDirectReg(38, RINGBACKPBXTONE_DR38, channel); writeDirectReg(39, RINGBACKPBXTONE_DR39, channel); writeDirectReg(40, RINGBACKPBXTONE_DR40, channel); writeDirectReg(41, RINGBACKPBXTONE_DR41, channel); writeDirectReg(42, RINGBACKPBXTONE_DR42, channel); writeDirectReg(43, RINGBACKPBXTONE_DR43, channel); writeDirectReg(32, RINGBACKPBXTONE_DR32, channel); writeDirectReg(33, RINGBACKPBXTONE_DR33, channel);}void slic_tone_ringBack(int channel){ writeIndirectReg(13,RINGBACKTONE_IR13, channel); writeIndirectReg(14,RINGBACKTONE_IR14, channel); writeIndirectReg(16,RINGBACKTONE_IR16, channel); writeIndirectReg(17,RINGBACKTONE_IR17, channel); writeDirectReg(36, RINGBACKTONE_DR36, channel); writeDirectReg(37, RINGBACKTONE_DR37, channel); writeDirectReg(38, RINGBACKTONE_DR38, channel); writeDirectReg(39, RINGBACKTONE_DR39, channel); writeDirectReg(40, RINGBACKTONE_DR40, channel); writeDirectReg(41, RINGBACKTONE_DR41, channel); writeDirectReg(42, RINGBACKTONE_DR42, channel); writeDirectReg(43, RINGBACKTONE_DR43, channel); writeDirectReg(32, RINGBACKTONE_DR32, channel); writeDirectReg(33, RINGBACKTONE_DR33, channel); }void slic_tone_ringBackJapan(int channel){ writeIndirectReg(13,RINGBACKJAPANTONE_IR13, channel); writeIndirectReg(14,RINGBACKJAPANTONE_IR14, channel); writeIndirectReg(16,RINGBACKJAPANTONE_IR16, channel); writeIndirectReg(17,RINGBACKJAPANTONE_IR17, channel); writeDirectReg(36, RINGBACKJAPANTONE_DR36, channel); writeDirectReg(37, RINGBACKJAPANTONE_DR37, channel); writeDirectReg(38, RINGBACKJAPANTONE_DR38, channel); writeDirectReg(39, RINGBACKJAPANTONE_DR39, channel); writeDirectReg(40, RINGBACKJAPANTONE_DR40, channel); writeDirectReg(41, RINGBACKJAPANTONE_DR41, channel); writeDirectReg(42, RINGBACKJAPANTONE_DR42, channel); writeDirectReg(43, RINGBACKJAPANTONE_DR43, channel); writeDirectReg(32, RINGBACKJAPANTONE_DR32, channel); writeDirectReg(33, RINGBACKJAPANTONE_DR33, channel);}void slic_tone_busyJapan(int channel){ writeIndirectReg(13,BUSYJAPANTONE_IR13, channel); writeIndirectReg(14,BUSYJAPANTONE_IR14, channel); writeIndirectReg(16,BUSYJAPANTONE_IR16, channel); writeIndirectReg(17,BUSYJAPANTONE_IR17, channel); writeDirectReg(36, BUSYJAPANTONE_DR36, channel); writeDirectReg(37, BUSYJAPANTONE_DR37, channel); writeDirectReg(38, BUSYJAPANTONE_DR38, channel); writeDirectReg(39, BUSYJAPANTONE_DR39, channel); writeDirectReg(40, BUSYJAPANTONE_DR40, channel); writeDirectReg(41, BUSYJAPANTONE_DR41, channel); writeDirectReg(42, BUSYJAPANTONE_DR42, channel); writeDirectReg(43, BUSYJAPANTONE_DR43, channel); writeDirectReg(32, BUSYJAPANTONE_DR32, channel); writeDirectReg(33, BUSYJAPANTONE_DR33, channel);}void slic_read_PCMCLK(int channel){ char* freqs[ ] = { "8192", /*0*/ "4028", /*1*/ "2048", /*2*/ "1024", /*3*/ "512", /*4*/ "256", /*5*/ "1536", /*6*/ "768", /*7*/ "32768" /*8*/ }; rtlglue_printf("\nPCM clock = %s KHz \n",freqs[readDirectReg(13, channel)>>4]);}/*@ ZONE: DTMF , the functions in the following is@ only used when slic generates kinds of tones*/unsigned char digit(int channel){ return readDirectReg(24, channel) & 0x0f;}void dtmfAction(int channel){ char rawDigit,asciiChar; rawDigit=digit(channel); /*asciiChar= '0' + digit;*/ switch (rawDigit){ case 0xA : asciiChar = '0'; break; case 0xB: asciiChar = '*'; break; case 0xC: asciiChar = '#'; break; default: asciiChar= '0' + rawDigit; break; } if (chipData[channel].digit_count < 20) { chipData[channel].DTMF_digits[chipData[channel].digit_count] = asciiChar; chipData[channel].digit_count++; chipData[channel].DTMF_digits[chipData[channel].digit_count]= 0; rtlglue_printf("Value= 0x%01x String collected \"%s\" \n", rawDigit, chipData[channel].DTMF_digits ); }}/* Accessory functions */void goActive(int channel){ unsigned long timeEpoch; extern unsigned long volatile jiffies; writeDirectReg(64,1,channel); /* LOOP STATE REGISTER SET TO ACTIVE */ /* Active works for on-hook and off-hook see spec. */ /* The phone hook-switch sets the off-hook and on-hook substate*/ timeEpoch = jiffies + 10; while(jiffies < timeEpoch);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -