⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slic.c

📁 linux下的SPI总线驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
		{			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 + -