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

📄 ixj.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
			-32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876		},		{			-28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,			-16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846		},		{			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,			32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876		},		{			28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,			16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846		}	},	{		{			0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,			0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126		},		{			-28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,			28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051		},		{			-28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,			28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925		},		{			0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,			0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126		},		{			28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,			-28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051		},		{			28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,			-28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925		}	}};static void ixj_write_cid_bit(int board, int bit){	int dly;	IXJ_WORD dat;	IXJ *j = &ixj[board];	while (j->fskcnt < 20) {		if (!IsTxReady(board)) {			dly = 0;			while (!IsTxReady(board)) {				if (dly++ > 5) {					dly = 0;					//      break;					//      printk("CID delay\n");				}				udelay(10);			}		}		dat.word = j->fskdata[j->fskdcnt++] =		    fsk[bit][j->fskz][j->fskcnt];		outb_p(dat.bytes.low, j->DSPbase + 0x0C);		outb_p(dat.bytes.high, j->DSPbase + 0x0D);		j->fskcnt += 3;	}	j->fskcnt %= 20;	if (!bit)		j->fskz++;	if (j->fskz >= 6)		j->fskz = 0;}static void ixj_write_cid_byte(int board, char byte){	IXJ_CBYTE cb;//  printk("Writing CID data %x - %c\n", byte, byte);	cb.cbyte = byte;	ixj_write_cid_bit(board, 0);	ixj_write_cid_bit(board, cb.cbits.b0 ? 1 : 0);	ixj_write_cid_bit(board, cb.cbits.b1 ? 1 : 0);	ixj_write_cid_bit(board, cb.cbits.b2 ? 1 : 0);	ixj_write_cid_bit(board, cb.cbits.b3 ? 1 : 0);	ixj_write_cid_bit(board, cb.cbits.b4 ? 1 : 0);	ixj_write_cid_bit(board, cb.cbits.b5 ? 1 : 0);	ixj_write_cid_bit(board, cb.cbits.b6 ? 1 : 0);	ixj_write_cid_bit(board, cb.cbits.b7 ? 1 : 0);	ixj_write_cid_bit(board, 1);}static void ixj_write_cid_seize(int board){	int cnt;	for (cnt = 0; cnt < 150; cnt++) {		ixj_write_cid_bit(board, 0);		ixj_write_cid_bit(board, 1);	}	for (cnt = 0; cnt < 180; cnt++) {		ixj_write_cid_bit(board, 1);	}}static void ixj_write_cidcw_seize(int board){	int cnt;	for (cnt = 0; cnt < 80; cnt++) {		ixj_write_cid_bit(board, 1);	}}static int ixj_write_cid_string(int board, char *s, int checksum){	int cnt;	for (cnt = 0; cnt < strlen(s); cnt++) {		ixj_write_cid_byte(board, s[cnt]);		checksum = (checksum + s[cnt]);	}	return checksum;}static void ixj_pad_fsk(int board, int pad){	int cnt, dly;	IXJ *j = &ixj[board];	for (cnt = 0; cnt < pad; cnt++) {		if (!IsTxReady(board)) {			dly = 0;			while (!IsTxReady(board)) {				if (dly++ > 5) {					dly = 0;				}				udelay(10);			}		}		outb_p(0x00, j->DSPbase + 0x0C);		outb_p(0x00, j->DSPbase + 0x0D);	}	for (cnt = 0; cnt < 720; cnt++) {		if (!IsTxReady(board)) {			dly = 0;			while (!IsTxReady(board)) {				if (dly++ > 5) {					dly = 0;				}				udelay(10);			}		}		outb_p(0x00, j->DSPbase + 0x0C);		outb_p(0x00, j->DSPbase + 0x0D);	}}static void ixj_write_cid(int board){	IXJ *j = &ixj[board];	char sdmf1[50];	char sdmf2[50];	char sdmf3[80];	char mdmflen, len1, len2, len3;	int pad;	int checksum = 0;	if (ixj[board].dsp.low == 0x20)		return;	ixj[board].fskz = ixj[board].fskphase = ixj[board].fskcnt =	    ixj[board].fskdcnt = 0;	ixj[board].flags.cidplay = 1;	strcpy(sdmf1, j->cid_send.month);	strcat(sdmf1, j->cid_send.day);	strcat(sdmf1, j->cid_send.hour);	strcat(sdmf1, j->cid_send.min);	strcpy(sdmf2, j->cid_send.number);	strcpy(sdmf3, j->cid_send.name);	len1 = strlen(sdmf1);	len2 = strlen(sdmf2);	len3 = strlen(sdmf3);	mdmflen = len1 + len2 + len3 + 6;	printk("CID Lengths = %d %d %d %d\n", len1, len2, len3, mdmflen);	set_base_frame(board, 30);	set_play_codec(board, LINEAR16);	if (ixj[board].port == PORT_POTS)		if(!j->r_hook)			SLIC_SetState(PLD_SLIC_STATE_OHT, board);	set_play_volume(board, 0x1B);	ixj_play_start(board);	ixj_write_cid_seize(board);	ixj_write_cid_byte(board, 0x80);	checksum = 0x80;	ixj_write_cid_byte(board, mdmflen);	checksum = checksum + mdmflen;	ixj_write_cid_byte(board, 0x01);	checksum = checksum + 0x01;	ixj_write_cid_byte(board, len1);	checksum = checksum + len1;	checksum = ixj_write_cid_string(board, sdmf1, checksum);	ixj_write_cid_byte(board, 0x02);	checksum = checksum + 0x02;	ixj_write_cid_byte(board, len2);	checksum = checksum + len2;	checksum = ixj_write_cid_string(board, sdmf2, checksum);	ixj_write_cid_byte(board, 0x07);	checksum = checksum + 0x07;	ixj_write_cid_byte(board, len3);	checksum = checksum + len3;	checksum = ixj_write_cid_string(board, sdmf3, checksum);	checksum %= 256;	checksum ^= 0xFF;	checksum += 1;	printk("14Checksum = %d\n", checksum);	ixj_write_cid_byte(board, (char) checksum);	pad = j->fskdcnt % 240;	if (pad) {		pad = 240 - pad;	}	ixj_pad_fsk(board, pad);	SLIC_SetState(PLD_SLIC_STATE_STANDBY, board);	ixj[board].flags.cidplay = 0;	ixj_play_stop(board);}static void ixj_write_cidcw(int board){	IXJ_TONE ti;	IXJ *j = &ixj[board];	char sdmf1[50];	char sdmf2[50];	char sdmf3[80];	char mdmflen, len1, len2, len3;	int pad;	int checksum = 0;	if (ixj[board].dsp.low == 0x20)		return;	ixj[board].fskz = ixj[board].fskphase = ixj[board].fskcnt = ixj[board].fskdcnt = 0;	ixj[board].flags.cidplay = 1;	ti.tone_index = 23;	ti.gain0 = 1;	ti.freq0 = hz440;	ti.gain1 = 0;	ti.freq1 = 0;	ixj_init_tone(board, &ti);	ti.tone_index = 24;	ti.gain0 = 1;	ti.freq0 = hz2130;	ti.gain1 = 0;	ti.freq1 = hz2750;	ixj_init_tone(board, &ti);	ixj_set_tone_on(1200, board);	ixj_play_tone(board, 23);	while(j->tone_state) {		set_current_state(TASK_INTERRUPTIBLE);		schedule_timeout(1);	}	ixj_set_tone_on(320, board);	ixj_play_tone(board, 24);	while(j->tone_state) {		set_current_state(TASK_INTERRUPTIBLE);		schedule_timeout(1);	}	j->cidcw_wait = jiffies + (200 * hertz / 100000);	while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait)) {		set_current_state(TASK_INTERRUPTIBLE);		schedule_timeout(1);	}	if(!j->flags.cidcw_ack) {		return;	}	strcpy(sdmf1, j->cid_send.month);	strcat(sdmf1, j->cid_send.day);	strcat(sdmf1, j->cid_send.hour);	strcat(sdmf1, j->cid_send.min);	strcpy(sdmf2, j->cid_send.number);	strcpy(sdmf3, j->cid_send.name);	len1 = strlen(sdmf1);	len2 = strlen(sdmf2);	len3 = strlen(sdmf3);	mdmflen = len1 + len2 + len3 + 6;	printk("CID Lengths = %d %d %d %d\n", len1, len2, len3, mdmflen);	j->cid_play_codec = j->play_codec;	ixj_play_stop(board);	switch(j->baseframe.low) {		case 0xA0:			j->cid_base_frame_size = 20;			break;		case 0x50:			j->cid_base_frame_size = 10;			break;		default:			j->cid_base_frame_size = 30;			break;	}	set_base_frame(board, 30);	set_play_codec(board, LINEAR16);	set_play_volume(board, 0x1B);	ixj_play_start(board);	ixj_write_cidcw_seize(board);	ixj_write_cid_byte(board, 0x80);	checksum = 0x80;	ixj_write_cid_byte(board, mdmflen);	checksum = checksum + mdmflen;	ixj_write_cid_byte(board, 0x01);	checksum = checksum + 0x01;	ixj_write_cid_byte(board, len1);	checksum = checksum + len1;	checksum = ixj_write_cid_string(board, sdmf1, checksum);	ixj_write_cid_byte(board, 0x02);	checksum = checksum + 0x02;	ixj_write_cid_byte(board, len2);	checksum = checksum + len2;	checksum = ixj_write_cid_string(board, sdmf2, checksum);	ixj_write_cid_byte(board, 0x07);	checksum = checksum + 0x07;	ixj_write_cid_byte(board, len3);	checksum = checksum + len3;	checksum = ixj_write_cid_string(board, sdmf3, checksum);	checksum %= 256;	checksum ^= 0xFF;	checksum += 1;	printk("14Checksum = %d\n", checksum);	ixj_write_cid_byte(board, (char) checksum);	pad = j->fskdcnt % 240;	if (pad) {		pad = 240 - pad;	}	ixj_pad_fsk(board, pad);	ixj[board].flags.cidplay = 0;	ixj_play_stop(board);	set_base_frame(board, j->cid_base_frame_size);	set_play_codec(board, j->cid_play_codec);}static void ixj_write_vmwi(int board, int msg){	IXJ *j = &ixj[board];	char mdmflen;	int pad;	int checksum = 0;	if (ixj[board].dsp.low == 0x20)		return;	ixj[board].fskz = ixj[board].fskphase = ixj[board].fskcnt = ixj[board].fskdcnt = 0;	ixj[board].flags.cidplay = 1;	mdmflen = 3;	set_base_frame(board, 30);	set_play_codec(board, LINEAR16);	if (ixj[board].port == PORT_POTS)		SLIC_SetState(PLD_SLIC_STATE_OHT, board);	set_play_volume(board, 0x1B);	ixj_play_start(board);	ixj_write_cid_seize(board);	ixj_write_cid_byte(board, 0x82);	checksum = 0x82;	ixj_write_cid_byte(board, mdmflen);	checksum = checksum + mdmflen;	ixj_write_cid_byte(board, 0x0B);	checksum = checksum + 0x0B;	ixj_write_cid_byte(board, 1);	checksum = checksum + 1;	if(msg) {		ixj_write_cid_byte(board, 0xFF);		checksum = checksum + 0xFF;	}	else {		ixj_write_cid_byte(board, 0x00);		checksum = checksum + 0x00;	}	checksum %= 256;	checksum ^= 0xFF;	checksum += 1;	ixj_write_cid_byte(board, (char) checksum);	pad = j->fskdcnt % 240;	if (pad) {		pad = 240 - pad;	}	ixj_pad_fsk(board, pad);	SLIC_SetState(PLD_SLIC_STATE_STANDBY, board);	ixj[board].flags.cidplay = 0;	ixj_play_stop(board);}static void ixj_write_frame(int board){	int cnt, frame_count, dly;	BYTES blankword;	IXJ *j = &ixj[board];	frame_count = 0;	if (j->write_buffer && j->write_buffers_empty < 2) {		if (j->write_buffer_wp > j->write_buffer_rp) {			frame_count =			    (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);		}		if (j->write_buffer_rp > j->write_buffer_wp) {			frame_count =			    (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) +			    (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2);		}		if (frame_count >= 1) {			if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) {				switch (j->play_mode) {				case PLAYBACK_MODE_ULAW:				case PLAYBACK_MODE_ALAW:					blankword.low = blankword.high = 0xFF;					break;				case PLAYBACK_MODE_8LINEAR:				case PLAYBACK_MODE_16LINEAR:					blankword.low = blankword.high = 0x00;					break;				case PLAYBACK_MODE_8LINEAR_WSS:					blankword.low = blankword.high = 0x80;					break;				}				for (cnt = 0; cnt < 16; cnt++) {					if (!(cnt % 16) && !IsTxReady(board)) {						dly = 0;						while (!IsTxReady(board)) {							if (dly++ > 5) {								dly = 0;								break;							}							udelay(10);						}					}					outb_p((blankword.low), j->DSPbase + 0x0C);					outb_p((blankword.high), j->DSPbase + 0x0D);				}				j->flags.play_first_frame = 0;			}			for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) {				if (!(cnt % 16) && !IsTxReady(board)) {					dly = 0;					while (!IsTxRe

⌨️ 快捷键说明

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