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

📄 ixj.c

📁 linux和2410结合开发 用他可以生成2410所需的zImage文件
💻 C
📖 第 1 页 / 共 5 页
字号:
				}				if (j->flags.ringback) {					ixj_ringback(j);					if (j->dsp.low == 0x20) {						clear_bit(board, &j->busyflags);						ixj_add_timer(j);						return;					}				}				if (!j->tone_state) {					ixj_cpt_stop(j);				}			}		}		if (!(j->tone_state && j->dsp.low == 0x20)) {			if (IsRxReady(j)) {				ixj_read_frame(j);			}			if (IsTxReady(j)) {				ixj_write_frame(j);			}		}		if (j->flags.cringing) {			if (j->hookstate & 1) {				j->flags.cringing = 0;				ixj_ring_off(j);			} else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) {				switch(j->cadence_f[5].state) {					case 0:						j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000));						if (time_before(jiffies, j->cadence_f[5].on1dot)) {							if(ixjdebug & 0x0004) {								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);							}							ixj_ring_on(j);						}						j->cadence_f[5].state = 1;						break;					case 1:						if (time_after(jiffies, j->cadence_f[5].on1dot)) {							j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000));							if(ixjdebug & 0x0004) {								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);							}							ixj_ring_off(j);							j->cadence_f[5].state = 2;						}						break;					case 2:						if (time_after(jiffies, j->cadence_f[5].off1dot)) {							if(ixjdebug & 0x0004) {								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);							}							ixj_ring_on(j);							if (j->cadence_f[5].on2) {								j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000));								j->cadence_f[5].state = 3;							} else {								j->cadence_f[5].state = 7;							}						}						break;					case 3:						if (time_after(jiffies, j->cadence_f[5].on2dot)) {							if(ixjdebug & 0x0004) {								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);							}							ixj_ring_off(j);							if (j->cadence_f[5].off2) {								j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000));								j->cadence_f[5].state = 4;							} else {								j->cadence_f[5].state = 7;							}						}						break;					case 4:						if (time_after(jiffies, j->cadence_f[5].off2dot)) {							if(ixjdebug & 0x0004) {								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);							}							ixj_ring_on(j);							if (j->cadence_f[5].on3) {								j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000));								j->cadence_f[5].state = 5;							} else {								j->cadence_f[5].state = 7;							}						}						break;					case 5:						if (time_after(jiffies, j->cadence_f[5].on3dot)) {							if(ixjdebug & 0x0004) {								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);							}							ixj_ring_off(j);							if (j->cadence_f[5].off3) {								j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000));								j->cadence_f[5].state = 6;							} else {								j->cadence_f[5].state = 7;							}						}						break;					case 6:						if (time_after(jiffies, j->cadence_f[5].off3dot)) {							if(ixjdebug & 0x0004) {								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);							}							j->cadence_f[5].state = 7;						}						break;					case 7:						if(ixjdebug & 0x0004) {							printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);						}						j->flags.cidring = 1;						j->cadence_f[5].state = 0;						break;				}				if (j->flags.cidring && !j->flags.cidsent) {					j->flags.cidsent = 1;					if(j->fskdcnt) {						SLIC_SetState(PLD_SLIC_STATE_OHT, j);						ixj_pre_cid(j);					}					j->flags.cidring = 0;				}				clear_bit(board, &j->busyflags);				ixj_add_timer(j);				return;			} else {				if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) {					if (j->flags.cidring && !j->flags.cidsent) {						j->flags.cidsent = 1;						if(j->fskdcnt) {							SLIC_SetState(PLD_SLIC_STATE_OHT, j);							ixj_pre_cid(j);						}						j->flags.cidring = 0;					}					j->ring_cadence_t--;					if (j->ring_cadence_t == -1)						j->ring_cadence_t = 15;					j->ring_cadence_jif = jiffies;					if (j->ring_cadence & 1 << j->ring_cadence_t) {						if(j->flags.cidsent && j->cadence_f[5].en_filter)							j->flags.firstring = 1;						else							ixj_ring_on(j);					} else {						ixj_ring_off(j);						if(!j->flags.cidsent)							j->flags.cidring = 1;					}				}				clear_bit(board, &j->busyflags);				ixj_add_timer(j);				return;			}		}		if (!j->flags.ringing) {			if (j->hookstate) { /* & 1) { */				if (j->dsp.low != 0x20 &&				    SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) {					SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);				}				LineMonitor(j);				read_filters(j);				ixj_WriteDSPCommand(0x511B, j);				j->proc_load = j->ssr.high << 8 | j->ssr.low;				if (!j->m_hook && (j->hookstate & 1)) {					j->m_hook = j->ex.bits.hookstate = 1;					ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);				}			} else {				if (j->ex.bits.dtmf_ready) {					j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0;				}				if (j->m_hook) {					j->m_hook = 0;					j->ex.bits.hookstate = 1;					ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);				}			}		}		if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) {			ixj_pstn_state(j);		}		if (j->ex.bytes) {			wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */		}		clear_bit(board, &j->busyflags);	}	ixj_add_timer(j);}static int ixj_status_wait(IXJ *j){	unsigned long jif;	jif = jiffies + ((60 * hertz) / 100);	while (!IsStatusReady(j)) {		ixj_perfmon(j->statuswait);		if (time_after(jiffies, jif)) {			ixj_perfmon(j->statuswaitfail);			return -1;		}	}	return 0;}static int ixj_PCcontrol_wait(IXJ *j){	unsigned long jif;	jif = jiffies + ((60 * hertz) / 100);	while (!IsPCControlReady(j)) {		ixj_perfmon(j->pcontrolwait);		if (time_after(jiffies, jif)) {			ixj_perfmon(j->pcontrolwaitfail);			return -1;		}	}	return 0;}static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j){	BYTES bytes;	unsigned long jif;	atomic_inc(&j->DSPWrite);	if(atomic_read(&j->DSPWrite) > 1) {		printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd);		return -1;	}	bytes.high = (cmd & 0xFF00) >> 8;	bytes.low = cmd & 0x00FF;	jif = jiffies + ((60 * hertz) / 100);	while (!IsControlReady(j)) {		ixj_perfmon(j->iscontrolready);		if (time_after(jiffies, jif)) {			ixj_perfmon(j->iscontrolreadyfail);			atomic_dec(&j->DSPWrite);			if(atomic_read(&j->DSPWrite) > 0) {				printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd);				while(atomic_read(&j->DSPWrite) > 0) {					atomic_dec(&j->DSPWrite);				}			}			return -1;		}	}	outb(bytes.low, j->DSPbase + 6);	outb(bytes.high, j->DSPbase + 7);	if (ixj_status_wait(j)) {		j->ssr.low = 0xFF;		j->ssr.high = 0xFF;		atomic_dec(&j->DSPWrite);		if(atomic_read(&j->DSPWrite) > 0) {			printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd);			while(atomic_read(&j->DSPWrite) > 0) {				atomic_dec(&j->DSPWrite);			}		}		return -1;	}/* Read Software Status Register */	j->ssr.low = inb_p(j->DSPbase + 2);	j->ssr.high = inb_p(j->DSPbase + 3);	atomic_dec(&j->DSPWrite);	if(atomic_read(&j->DSPWrite) > 0) {		printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd);		while(atomic_read(&j->DSPWrite) > 0) {			atomic_dec(&j->DSPWrite);		}	}	return 0;}/*****************************************************************************  General Purpose IO Register read routine****************************************************************************/static inline int ixj_gpio_read(IXJ *j){	if (ixj_WriteDSPCommand(0x5143, j))		return -1;	j->gpio.bytes.low = j->ssr.low;	j->gpio.bytes.high = j->ssr.high;	return 0;}static inline void LED_SetState(int state, IXJ *j){	if (j->cardtype == QTI_LINEJACK) {		j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;		j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0;		j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;		j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0;		outb(j->pld_scrw.byte, j->XILINXbase);	}}/**********************************************************************  GPIO Pins are configured as follows on the Quicknet Internet*  PhoneJACK Telephony Cards* * POTS Select        GPIO_6=0 GPIO_7=0* Mic/Speaker Select GPIO_6=0 GPIO_7=1* Handset Select     GPIO_6=1 GPIO_7=0** SLIC Active        GPIO_1=0 GPIO_2=1 GPIO_5=0* SLIC Ringing       GPIO_1=1 GPIO_2=1 GPIO_5=0* SLIC Open Circuit  GPIO_1=0 GPIO_2=0 GPIO_5=0** Hook Switch changes reported on GPIO_3*********************************************************************/static int ixj_set_port(IXJ *j, int arg){	if (j->cardtype == QTI_PHONEJACK_LITE) {		if (arg != PORT_POTS)			return 10;		else			return 0;	}	switch (arg) {	case PORT_POTS:		j->port = PORT_POTS;		switch (j->cardtype) {		case QTI_PHONECARD:			if (j->flags.pcmciasct == 1)				SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);			else				return 11;			break;		case QTI_PHONEJACK_PCI:			j->pld_slicw.pcib.mic = 0;			j->pld_slicw.pcib.spk = 0;			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);			break;		case QTI_LINEJACK:			ixj_set_pots(j, 0);			/* Disconnect POTS/PSTN relay */			if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to									   Software Control Register */				return 2;			j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */			outb(j->pld_scrw.byte, j->XILINXbase);			j->pld_clock.byte = 0;			outb(j->pld_clock.byte, j->XILINXbase + 0x04);			j->pld_slicw.bits.rly1 = 1;			j->pld_slicw.bits.spken = 0;			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);			ixj_mixer(0x1200, j);	/* Turn Off MIC switch on mixer left */			ixj_mixer(0x1401, j);	/* Turn On Mono1 switch on mixer left */			ixj_mixer(0x1300, j);       /* Turn Off MIC switch on mixer right */			ixj_mixer(0x1501, j);       /* Turn On Mono1 switch on mixer right */			ixj_mixer(0x0E80, j);	/*Mic mute */			ixj_mixer(0x0F00, j);	/* Set mono out (SLIC) to 0dB */			ixj_mixer(0x0080, j);	/* Mute Master Left volume */			ixj_mixer(0x0180, j);	/* Mute Master Right volume */			SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);/*			SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */			break;		case QTI_PHONEJACK:			j->gpio.bytes.high = 0x0B;			j->gpio.bits.gpio6 = 0;			j->gpio.bits.gpio7 = 0;			ixj_WriteDSPCommand(j->gpio.word, j);			break;		}		break;	case PORT_PSTN:		if (j->cardtype == QTI_LINEJACK) {			ixj_WriteDSPCommand(0xC534, j);	/* Write CODEC config to Software Control Register */			j->pld_slicw.bits.rly3 = 0;			j->pld_slicw.bits.rly1 = 1;			j->pld_slicw.bits.spken = 0;			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);			j->port = PORT_PSTN;		} else {			return 4;		}		break;	case PORT_SPEAKER:		j->port = PORT_SPEAKER;		switch (j->cardtype) {		case QTI_PHONECARD:			if (j->flags.pcmciasct) {				SLIC_SetState(PLD_SLIC_STATE_OC, j);			}			break;		case QTI_PHONEJACK_PCI:			j->pld_slicw.pcib.mic = 1;			j->pld_slicw.pcib.spk = 1;			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);			break;		case QTI_LINEJACK:			ixj_set_pots(j, 0);			/* Disconnect POTS/PSTN relay */			if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to									   Software Control Register */				return 2;			j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */			outb(j->pld_scrw.byte, j->XILINXbase);			j->pld_clock.byte = 0;			outb(j->pld_clock.byte, j->XILINXbase + 0x04);			j->pld_slicw.bits.rly1 = 1;			j->pld_slicw.bits.spken = 1;			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);			ixj_mixer(0x1201, j);	/* Turn On MIC switch on mixer left */			ixj_mixer(0x1400, j);	/* Turn Off Mono1 switch on mixer left */			ixj_mixer(0x1301, j);       /* Turn On MIC switch on mixer right */			ixj_mixer(0x1500, j);       /* Turn Off Mono1 switch on mixer right */			ixj_mixer(0x0E06, j);	/*Mic un-mute 0dB */			ixj_mixer(0x0F80, j);	/* Mute mono out (SLIC) */			ixj_mixer(0x0000, j);	/* Set Master Left volume to 0dB */			ixj_mixer(0x0100, j);	/* Set Master Right volume to 0dB */			break;		case QTI_PHONEJACK:			j->gpio.bytes.high = 0x0B;			j->gpio.bits.gpio6 = 0;			j->gpio.bits.gpio7 = 1;			ixj_WriteDSPCommand(j->gpio.word, j);			break;		}		break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -