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

📄 ixj.c

📁 linux和2410结合开发 用他可以生成2410所需的zImage文件
💻 C
📖 第 1 页 / 共 5 页
字号:
		ixj_PreIoctl = &Stub;		break;	case POST_IOCTL:		ixj_PostIoctl = &Stub;		break;	default:		retval = 1;	}	return retval;}EXPORT_SYMBOL(ixj_unregister);static void ixj_init_timer(IXJ *j){	init_timer(&j->timer);	j->timer.function = ixj_timeout;	j->timer.data = (unsigned long)j;}static void ixj_add_timer(IXJ *j){	j->timer.expires = jiffies + (hertz / samplerate);	add_timer(&j->timer);}static void ixj_tone_timeout(IXJ *j){	IXJ_TONE ti;	j->tone_state++;	if (j->tone_state == 3) {		j->tone_state = 0;		if (j->cadence_t) {			j->tone_cadence_state++;			if (j->tone_cadence_state >= j->cadence_t->elements_used) {				switch (j->cadence_t->termination) {				case PLAY_ONCE:					ixj_cpt_stop(j);					break;				case REPEAT_LAST_ELEMENT:					j->tone_cadence_state--;					ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);					break;				case REPEAT_ALL:					j->tone_cadence_state = 0;					if (j->cadence_t->ce[j->tone_cadence_state].freq0) {						ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;						ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;						ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;						ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;						ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;						ixj_init_tone(j, &ti);					}					ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j);					ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j);					ixj_play_tone(j, j->cadence_t->ce[0].index);					break;				}			} else {				if (j->cadence_t->ce[j->tone_cadence_state].gain0) {					ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;					ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;					ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;					ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;					ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;					ixj_init_tone(j, &ti);				}				ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j);				ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j);				ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);			}		}	}}static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir){	if(j->ixj_signals[event]) {		if(ixjdebug & 0x0100)			printk("Sending signal for event %d\n", event);			/* Send apps notice of change */		/* see config.h for macro definition */		kill_fasync(&(j->async_queue), j->ixj_signals[event], dir);	}}static void ixj_pstn_state(IXJ *j){	int var;	union XOPXR0 XR0, daaint;	var = 10;	XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg;	daaint.reg = 0;	XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;	j->pld_scrr.byte = inb_p(j->XILINXbase);	if (j->pld_scrr.bits.daaflag) {		daa_int_read(j);		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {			if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {				daaint.bitreg.RING = 1;				if(ixjdebug & 0x0008) {					printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies);				}			} else {				daa_set_mode(j, SOP_PU_RESET);			}		}		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {			daaint.bitreg.Caller_ID = 1;			j->pstn_cid_intr = 1;			j->pstn_cid_received = jiffies;			if(ixjdebug & 0x0008) {				printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies);			}		}		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {			daaint.bitreg.Cadence = 1;			if(ixjdebug & 0x0008) {				printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies);			}		}		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) {			daaint.bitreg.VDD_OK = 1;			daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK;		}	}	daa_CR_read(j, 1);	if(j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR != XR0.bitreg.RMR && time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {		daaint.bitreg.RMR = 1;		daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;		if(ixjdebug & 0x0008) {                        printk(KERN_INFO "IXJ DAA RMR /dev/phone%d was %s for %ld\n", j->board, XR0.bitreg.RMR?"on":"off", jiffies - j->pstn_last_rmr);		}		j->pstn_prev_rmr = j->pstn_last_rmr;		j->pstn_last_rmr = jiffies;	}	switch(j->daa_mode) {		case SOP_PU_SLEEP:			if (daaint.bitreg.RING) {				if (!j->flags.pstn_ringing) {					if (j->daa_mode != SOP_PU_RINGING) {						j->pstn_ring_int = jiffies;						daa_set_mode(j, SOP_PU_RINGING);					}				}			}			break;		case SOP_PU_RINGING:			if (daaint.bitreg.RMR) {				if (ixjdebug & 0x0008) {					printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);				}				if (daaint.bitreg.SI_1) {                /* Rising edge of RMR */					j->flags.pstn_rmr = 1;					j->pstn_ring_start = jiffies;					j->pstn_ring_stop = 0;					j->ex.bits.pstn_ring = 0;					if (j->cadence_f[4].state == 0) {						j->cadence_f[4].state = 1;						j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000);						j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000);						j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000);					} else if (j->cadence_f[4].state == 2) {						if((time_after(jiffies, j->cadence_f[4].off1min) &&						    time_before(jiffies, j->cadence_f[4].off1max))) {							if (j->cadence_f[4].on2) {								j->cadence_f[4].state = 3;								j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000));								j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000));								j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000));							} else {								j->cadence_f[4].state = 7;							}						} else {							if (ixjdebug & 0x0008) {								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,										j->cadence_f[4].off1);							}							j->cadence_f[4].state = 0;						}					} else if (j->cadence_f[4].state == 4) {						if((time_after(jiffies, j->cadence_f[4].off2min) &&						    time_before(jiffies, j->cadence_f[4].off2max))) {							if (j->cadence_f[4].on3) {								j->cadence_f[4].state = 5;								j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000));								j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000));								j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000));							} else {								j->cadence_f[4].state = 7;							}						} else {							if (ixjdebug & 0x0008) {								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,										j->cadence_f[4].off2);							}							j->cadence_f[4].state = 0;						}					} else if (j->cadence_f[4].state == 6) {						if((time_after(jiffies, j->cadence_f[4].off3min) &&						    time_before(jiffies, j->cadence_f[4].off3max))) {							j->cadence_f[4].state = 7;						} else {							if (ixjdebug & 0x0008) {								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,										j->cadence_f[4].off3);							}							j->cadence_f[4].state = 0;						}					} else {						j->cadence_f[4].state = 0;					}				} else {                                /* Falling edge of RMR */					j->pstn_ring_start = 0;					j->pstn_ring_stop = jiffies;					if (j->cadence_f[4].state == 1) {						if(!j->cadence_f[4].on1) {							j->cadence_f[4].state = 7;						} else if((time_after(jiffies, j->cadence_f[4].on1min) &&					          time_before(jiffies, j->cadence_f[4].on1max))) {							if (j->cadence_f[4].off1) {								j->cadence_f[4].state = 2;								j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000));								j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000));								j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000));							} else {								j->cadence_f[4].state = 7;							}						} else {							if (ixjdebug & 0x0008) {								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,										j->cadence_f[4].on1);							}							j->cadence_f[4].state = 0;						}					} else if (j->cadence_f[4].state == 3) {						if((time_after(jiffies, j->cadence_f[4].on2min) &&						    time_before(jiffies, j->cadence_f[4].on2max))) {							if (j->cadence_f[4].off2) {								j->cadence_f[4].state = 4;								j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000));								j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000));								j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000));							} else {								j->cadence_f[4].state = 7;							}						} else {							if (ixjdebug & 0x0008) {								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,										j->cadence_f[4].on2);							}							j->cadence_f[4].state = 0;						}					} else if (j->cadence_f[4].state == 5) {						if((time_after(jiffies, j->cadence_f[4].on3min) &&						    time_before(jiffies, j->cadence_f[4].on3max))) {							if (j->cadence_f[4].off3) {								j->cadence_f[4].state = 6;								j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000));								j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000));								j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000));							} else {								j->cadence_f[4].state = 7;							}						} else {							j->cadence_f[4].state = 0;						}					} else {						if (ixjdebug & 0x0008) {							printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",									j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,									j->cadence_f[4].on3);						}						j->cadence_f[4].state = 0;					}				}				if (ixjdebug & 0x0010) {					printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);				}				if (ixjdebug & 0x0010) {					switch(j->cadence_f[4].state) {						case 1:							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,						j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max);							break;						case 2:							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,						j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max);							break;						case 3:							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,						j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max);							break;						case 4:							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,						j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max);							break;						case 5:							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,						j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max);							break;						case 6:								printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,						j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max);							break;					}				}			}			if (j->cadence_f[4].state == 7) {				j->cadence_f[4].state = 0;				j->pstn_ring_stop = jiffies;				j->ex.bits.pstn_ring = 1;				ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN);				if(ixjdebug & 0x0008) {					printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies);				}			}			if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) ||			   (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) {				if(ixjdebug & 0x0008) {					printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies);					printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int);					printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop);				}				j->pstn_ring_stop = j->pstn_ring_int = 0;				daa_set_mode(j, SOP_PU_SLEEP);			} 			outb_p(j->pld_scrw.byte, j->XILINXbase);			if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) {				ixj_daa_cid_read(j);				j->ex.bits.caller_id = 1;				ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN);				j->pstn_cid_intr = 0;			}			if (daaint.bitreg.Cadence) {				if(ixjdebug & 0x0008) {					printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board);				}				daa_set_mode(j, SOP_PU_SLEEP);				j->ex.bits.pstn_ring = 0;			}			break;		case SOP_PU_CONVERSATION:			if (daaint.bitreg.VDD_OK) {				if(!daaint.bitreg.SI_0) {					if (!j->pstn_winkstart) {						if(ixjdebug & 0x0008) {							printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies);						}						j->pstn_winkstart = jiffies;					} 				} else {					if (j->pstn_winkstart) {						if(ixjdebug & 0x0008) {							printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies);						}						j->pstn_winkstart = 0;					}				}			}			if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) {				if(ixjdebug & 0x0008) {					printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies);				}				daa_set_mode(j, SOP_PU_SLEEP);				j->pstn_winkstart = 0;				j->ex.bits.pstn_wink = 1;				ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN);			}			break;	}}static void ixj_timeout(unsigned long ptr){	int board;	unsigned long jifon;	IXJ *j = (IXJ *)ptr;	board = j->board;	if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) {		ixj_perfmon(j->timerchecks);		j->hookstate = ixj_hookstate(j);		if (j->tone_state) {			if (!(j->hookstate)) {				ixj_cpt_stop(j);				if (j->m_hook) {					j->m_hook = 0;					j->ex.bits.hookstate = 1;					ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);				}				clear_bit(board, &j->busyflags);				ixj_add_timer(j);				return;			}			if (j->tone_state == 1)				jifon = ((hertz * j->tone_on_time) * 25 / 100000);			else				jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000);			if (time_before(jiffies, j->tone_start_jif + jifon)) {				if (j->tone_state == 1) {					ixj_play_tone(j, j->tone_index);					if (j->dsp.low == 0x20) {						clear_bit(board, &j->busyflags);						ixj_add_timer(j);						return;					}				} else {					ixj_play_tone(j, 0);					if (j->dsp.low == 0x20) {						clear_bit(board, &j->busyflags);						ixj_add_timer(j);						return;					}				}			} else {				ixj_tone_timeout(j);				if (j->flags.dialtone) {					ixj_dialtone(j);				}				if (j->flags.busytone) {					ixj_busytone(j);					if (j->dsp.low == 0x20) {						clear_bit(board, &j->busyflags);						ixj_add_timer(j);						return;					}

⌨️ 快捷键说明

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