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

📄 ixj.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	ti.gain0 = 1;	ti.freq0 = hz1600;	ti.gain1 = 0;	ti.freq1 = 0;	ixj_init_tone(board, &ti);	ti.tone_index = 21;	ti.gain0 = 1;	ti.freq0 = hz1800;	ti.gain1 = 0;	ti.freq1 = 0;	ixj_init_tone(board, &ti);	ti.tone_index = 22;	ti.gain0 = 1;	ti.freq0 = hz2100;	ti.gain1 = 0;	ti.freq1 = 0;	ixj_init_tone(board, &ti);	ti.tone_index = 23;	ti.gain0 = 1;	ti.freq0 = hz1300;	ti.gain1 = 0;	ti.freq1 = 0;	ixj_init_tone(board, &ti);	ti.tone_index = 24;	ti.gain0 = 1;	ti.freq0 = hz2450;	ti.gain1 = 0;	ti.freq1 = 0;	ixj_init_tone(board, &ti);	ti.tone_index = 25;	ti.gain0 = 1;	ti.freq0 = hz350;	ti.gain1 = 0;	ti.freq1 = hz440;	ixj_init_tone(board, &ti);	ti.tone_index = 26;	ti.gain0 = 1;	ti.freq0 = hz440;	ti.gain1 = 0;	ti.freq1 = hz480;	ixj_init_tone(board, &ti);	ti.tone_index = 27;	ti.gain0 = 1;	ti.freq0 = hz480;	ti.gain1 = 0;	ti.freq1 = hz620;	ixj_init_tone(board, &ti);	idle(board);//        if(j->cardtype == 600) { // && j->flags.pcmciasct == 1 && j->readers == 1 && j->writers == 1) {	SLIC_SetState(PLD_SLIC_STATE_OC, board);//      }	if (file_p->f_mode & FMODE_READ)		j->readers--;	if (file_p->f_mode & FMODE_WRITE)		j->writers--;	if (j->read_buffer && !j->readers) {		kfree(j->read_buffer);		j->read_buffer = NULL;		j->read_buffer_size = 0;	}	if (j->write_buffer && !j->writers) {		kfree(j->write_buffer);		j->write_buffer = NULL;		j->write_buffer_size = 0;	}	j->rec_codec = j->play_codec = 0;	j->rec_frame_size = j->play_frame_size = 0;	j->flags.cidsent = j->flags.cidring = 0;	ixj_fasync(-1, file_p, 0);	// remove from list of async notification	if(j->cardtype == 300 && !j->readers && !j->writers) {		ixj_set_port(board, PORT_PSTN);		ixj_set_pots(board, 1);	}	ixj_WriteDSPCommand(0x0FE3, board);	// Put the DSP in 1/5 power mode.	file_p->private_data = NULL;	MOD_DEC_USE_COUNT;	return 0;}static int read_filters(int board){	unsigned short fc, cnt;	int var;	IXJ *j = &ixj[board];	if (ixj_WriteDSPCommand(0x5144, board))		return -1;	fc = j->ssr.high << 8 | j->ssr.low;	if (fc == j->frame_count)		return 1;	j->frame_count = fc;	if (j->dtmf_proc)		return 1;	var = 10;	for (cnt = 0; cnt < 4; cnt++) {		if (ixj_WriteDSPCommand(0x5154 + cnt, board))			return -1;		if (ixj_WriteDSPCommand(0x515C, board))			return -1;		j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low;		if (j->cadence_f[cnt].enable) {			if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) {				if (j->cadence_f[cnt].state == 0) {					j->cadence_f[cnt].state = 1;					j->cadence_f[cnt].on1min = jiffies + (j->cadence_f[cnt].on1 * hertz * (100 - var) / 10000);					j->cadence_f[cnt].on1dot = jiffies + (j->cadence_f[cnt].on1 * hertz * (100) / 10000);					j->cadence_f[cnt].on1max = jiffies + (j->cadence_f[cnt].on1 * hertz * (100 + var) / 10000);				} else if (j->cadence_f[cnt].state == 2 &&					   (time_after(jiffies, j->cadence_f[cnt].off1min) &&					    time_before(jiffies, j->cadence_f[cnt].off1max))) {					if (j->cadence_f[cnt].on2) {						j->cadence_f[cnt].state = 3;						j->cadence_f[cnt].on2min = jiffies + (j->cadence_f[cnt].on2 * hertz * (100 - var) / 10000);						j->cadence_f[cnt].on2dot = jiffies + (j->cadence_f[cnt].on2 * hertz * (100) / 10000);						j->cadence_f[cnt].on2max = jiffies + (j->cadence_f[cnt].on2 * hertz * (100 + var) / 10000);					} else {						j->cadence_f[cnt].state = 6;					}				} else if (j->cadence_f[cnt].state == 4 &&					   (time_after(jiffies, j->cadence_f[cnt].off2min) &&					    time_before(jiffies, j->cadence_f[cnt].off2max))) {					if (j->cadence_f[cnt].on2) {						j->cadence_f[cnt].state = 5;						j->cadence_f[cnt].on3min = jiffies + (j->cadence_f[cnt].on3 * hertz * (100 - var) / 10000);						j->cadence_f[cnt].on3dot = jiffies + (j->cadence_f[cnt].on3 * hertz * (100) / 10000);						j->cadence_f[cnt].on3max = jiffies + (j->cadence_f[cnt].on3 * hertz * (100 + var) / 10000);					} else {						j->cadence_f[cnt].state = 6;					}				} else {					j->cadence_f[cnt].state = 0;				}			} else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) {				if (j->cadence_f[cnt].state == 1 &&				    (time_after(jiffies, j->cadence_f[cnt].on1min) &&				     time_before(jiffies, j->cadence_f[cnt].on1max))) {					j->cadence_f[cnt].state = 2;					j->cadence_f[cnt].off1min = jiffies + (j->cadence_f[cnt].off1 * hertz * (100 - var) / 10000);					j->cadence_f[cnt].off1max = jiffies + (j->cadence_f[cnt].off1 * hertz * (100 + var) / 10000);				} else if (j->cadence_f[cnt].state == 3 &&					   (time_after(jiffies, j->cadence_f[cnt].on2min) &&					    time_before(jiffies, j->cadence_f[cnt].on2max))) {					j->cadence_f[cnt].state = 4;					j->cadence_f[cnt].off2min = jiffies + (j->cadence_f[cnt].off2 * hertz * (100 - var) / 10000);					j->cadence_f[cnt].off2max = jiffies + (j->cadence_f[cnt].off2 * hertz * (100 + var) / 10000);				} else if (j->cadence_f[cnt].state == 5 &&					   (time_after(jiffies, j->cadence_f[cnt].on3min) &&					    time_before(jiffies, j->cadence_f[cnt].on3max))) {					j->cadence_f[cnt].state = 6;					j->cadence_f[cnt].off3min = jiffies + (j->cadence_f[cnt].off3 * hertz * (100 - var) / 10000);					j->cadence_f[cnt].off3max = jiffies + (j->cadence_f[cnt].off3 * hertz * (100 + var) / 10000);				} else {					j->cadence_f[cnt].state = 0;				}			} else {				switch(j->cadence_f[cnt].state) {					case 1:						if(time_after(jiffies, j->cadence_f[cnt].on1dot) &&						   !j->cadence_f[cnt].off1 &&						   !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 &&						   !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {							j->cadence_f[cnt].state = 6;						}						break;					case 3:						if(time_after(jiffies, j->cadence_f[cnt].on2dot) &&						   !j->cadence_f[cnt].off2 &&						   !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {							j->cadence_f[cnt].state = 6;						}						break;					case 5:						if(time_after(jiffies, j->cadence_f[cnt].on3dot) &&						   !j->cadence_f[cnt].off3) {							j->cadence_f[cnt].state = 6;						}						break;				}			}		}		if (j->cadence_f[cnt].state == 6) {			j->cadence_f[cnt].state = 0;			if (j->cadence_f[cnt].enable == 1)				j->cadence_f[cnt].enable = 0;			switch (cnt) {			case 0:				j->ex.bits.fc0 = 1;				break;			case 1:				j->ex.bits.fc1 = 1;				break;			case 2:				j->ex.bits.fc2 = 1;				break;			case 3:				j->ex.bits.fc3 = 1;				break;			}		}		if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) ||					  (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) {			switch (cnt) {			case 0:				j->ex.bits.f0 = 1;				break;			case 1:				j->ex.bits.f1 = 1;				break;			case 2:				j->ex.bits.f2 = 1;				break;			case 3:				j->ex.bits.f3 = 1;				break;			}		}	}	return 0;}static int LineMonitor(int board){	IXJ *j = &ixj[board];	if (j->dtmf_proc) {		return -1;	}	j->dtmf_proc = 1;	if (ixj_WriteDSPCommand(0x7000, board))		// Line Monitor		return -1;	j->dtmf.bytes.high = j->ssr.high;	j->dtmf.bytes.low = j->ssr.low;	if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) {		j->dtmf_state = 1;		j->dtmf_current = j->dtmf.bits.digit;	}	if (j->dtmf_state && !j->dtmf.bits.dtmf_valid)	// && j->dtmf_wp != j->dtmf_rp)	 {		if(!j->flags.cidplay) {			j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;			j->dtmf_wp++;			if (j->dtmf_wp == 79)				j->dtmf_wp = 0;			j->ex.bits.dtmf_ready = 1;		}		else if(j->dtmf_current == 25 || j->dtmf_current == 31) {			j->flags.cidcw_ack = 1;		}		j->dtmf_state = 0;	}	j->dtmf_proc = 0;	return 0;}ssize_t ixj_read(struct file * file_p, char *buf, size_t length, loff_t * ppos){	unsigned long i = *ppos;	IXJ *j = &ixj[NUM(file_p->f_dentry->d_inode->i_rdev)];	DECLARE_WAITQUEUE(wait, current);	if (j->flags.inread)		return -EALREADY;	j->flags.inread = 1;	add_wait_queue(&j->read_q, &wait);	set_current_state(TASK_INTERRUPTIBLE);	mb();	while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {		++j->read_wait;		if(j->tone_state) {			set_current_state(TASK_RUNNING);			remove_wait_queue(&j->read_q, &wait);			j->flags.inread = 0;			return -EAGAIN;		}		if (file_p->f_flags & O_NONBLOCK) {			set_current_state(TASK_RUNNING);			remove_wait_queue(&j->read_q, &wait);			j->flags.inread = 0;			return -EAGAIN;		}		if (!ixj_hookstate(NUM(file_p->f_dentry->d_inode->i_rdev))) {			set_current_state(TASK_RUNNING);			remove_wait_queue(&j->read_q, &wait);			j->flags.inread = 0;			return 0;		}		interruptible_sleep_on(&j->read_q);		if (signal_pending(current)) {			set_current_state(TASK_RUNNING);			remove_wait_queue(&j->read_q, &wait);			j->flags.inread = 0;			return -EINTR;		}	}	remove_wait_queue(&j->read_q, &wait);	set_current_state(TASK_RUNNING);	/* Don't ever copy more than the user asks */	i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size));	j->read_buffer_ready = 0;	if (i) {		j->flags.inread = 0;		return -EFAULT;	} else {		j->flags.inread = 0;		return min(length, j->read_buffer_size);	}}ssize_t ixj_enhanced_read(struct file * file_p, char *buf, size_t length,			  loff_t * ppos){	int pre_retval;	ssize_t read_retval = 0;	IXJ *j = &ixj[NUM(file_p->f_dentry->d_inode->i_rdev)];	pre_retval = ixj_PreRead(j, 0L);	switch (pre_retval) {	case NORMAL:		read_retval = ixj_read(file_p, buf, length, ppos);		ixj_PostRead(j, 0L);		break;	case NOPOST:		read_retval = ixj_read(file_p, buf, length, ppos);		break;	case POSTONLY:		ixj_PostRead(j, 0L);		break;	default:		read_retval = pre_retval;	}	return read_retval;}ssize_t ixj_write(struct file *file_p, const char *buf, size_t count, loff_t * ppos){	unsigned long i = *ppos;	IXJ *j = file_p->private_data;	DECLARE_WAITQUEUE(wait, current);	if (j->flags.inwrite)		return -EALREADY;	j->flags.inwrite = 1;	add_wait_queue(&j->write_q, &wait);	set_current_state(TASK_INTERRUPTIBLE);	mb();	while (!j->write_buffers_empty) {		++j->write_wait;		if(j->tone_state) {			set_current_state(TASK_RUNNING);			remove_wait_queue(&j->write_q, &wait);			j->flags.inwrite = 0;			return -EAGAIN;		}		if (file_p->f_flags & O_NONBLOCK) {			set_current_state(TASK_RUNNING);			remove_wait_queue(&j->write_q, &wait);			j->flags.inwrite = 0;			return -EAGAIN;		}		if (!ixj_hookstate(NUM(file_p->f_dentry->d_inode->i_rdev))) {			set_current_state(TASK_RUNNING);			remove_wait_queue(&j->write_q, &wait);			j->flags.inwrite = 0;			return 0;		}		interruptible_sleep_on(&j->write_q);		if (signal_pending(current)) {			set_current_state(TASK_RUNNING);			remove_wait_queue(&j->write_q, &wait);			j->flags.inwrite = 0;			return -EINTR;		}	}	set_current_state(TASK_RUNNING);	remove_wait_queue(&j->write_q, &wait);	if (j->write_buffer_wp + count >= j->write_buffer_end)		j->write_buffer_wp = j->write_buffer;	i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size));	if (i) {		j->flags.inwrite = 0;		return -EFAULT;	}	j->flags.inwrite = 0;	return min(count, j->write_buffer_size);}ssize_t ixj_enhanced_write(struct file * file_p, const char *buf, size_t count, loff_t * ppos){	int pre_retval;	ssize_t write_retval = 0;	IXJ *j = &ixj[NUM(file_p->f_dentry->d_inode->i_rdev)];	pre_retval = ixj_PreWrite(j, 0L);	switch (pre_retval) {	case NORMAL:		write_retval = ixj_write(file_p, buf, count, ppos);		if (write_retval != -EFAULT) {			ixj_PostWrite(j, 0L);			j->write_buffer_wp += count;			j->write_buffers_empty--;		}		break;	case NOPOST:		write_retval = ixj_write(file_p, buf, count, ppos);		if (write_retval != -EFAULT) {			j->write_buffer_wp += count;			j->write_buffers_empty--;		}		break;	case POSTONLY:		ixj_PostWrite(j, 0L);		break;	default:		write_retval = pre_retval;	}	return write_retval;}static void ixj_read_frame(int board){	int cnt, dly;	IXJ *j = &ixj[board];	if (j->read_buffer) {		for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {			if (!(cnt % 16) && !IsRxReady(board)) {				dly = 0;				while (!IsRxReady(board)) {					if (dly++ > 5) {						dly = 0;						break;					}					udelay(10);				}			}			// Throw away word 0 of the 8021 compressed format to get standard G.729.			if (j->rec_codec == G729 && (cnt == 0 || cnt == 5 || cnt == 10)) {				inb_p(j->DSPbase + 0x0E);				inb_p(j->DSPbase + 0x0F);			}			*(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E);			*(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F);		}		++j->framesread;		if (j->intercom != -1) {			if (IsTxReady(j->intercom)) {				for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {					if (!(cnt % 16) && !IsTxReady(board)) {						dly = 0;						while (!IsTxReady(board)) {							if (dly++ > 5) {								dly = 0;								break;							}							udelay(10);						}					}					outb_p(*(j->read_buffer + cnt), ixj[j->intercom].DSPbase + 0x0C);					outb_p(*(j->read_buffer + cnt + 1), ixj[j->intercom].DSPbase + 0x0D);				}				++ixj[j->intercom].frameswritten;			}		} else {			j->read_buffer_ready = 1;			wake_up_interruptible(&j->read_q);	// Wake any blocked readers			wake_up_interruptible(&j->poll_q);	// Wake any blocked selects			ixj_kill_fasync(board, POLL_OUT);		}	}}static short fsk[][6][20] ={	{		{			0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,			-16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722		},		{			-28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,

⌨️ 快捷键说明

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