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

📄 ixj.c

📁 mgcp协议源代码。支持多种编码:g711
💻 C
📖 第 1 页 / 共 5 页
字号:
		idle(board);	j->tone_index = tone;	if (ixj_WriteDSPCommand(0x6000 + j->tone_index, board))		return -1;	if (!j->tone_state) {		j->tone_start_jif = jiffies;		j->tone_state = 1;	}	return 0;}static int ixj_set_tone_on(unsigned short arg, int board){	IXJ *j = &ixj[board];	j->tone_on_time = arg;	if (ixj_WriteDSPCommand(0x6E04, board))		// Set Tone On Period		return -1;	if (ixj_WriteDSPCommand(arg, board))		return -1;	return 0;}static int SCI_WaitHighSCI(int board){	int cnt;	IXJ *j = &ixj[board];	j->pld_scrr.byte = inb_p(j->XILINXbase);	if (!j->pld_scrr.bits.sci) {		for (cnt = 0; cnt < 10; cnt++) {			udelay(32);			j->pld_scrr.byte = inb_p(j->XILINXbase);			if ((j->pld_scrr.bits.sci))				return 1;		}		if (ixjdebug > 1)			printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte);		return 0;	} else		return 1;}static int SCI_WaitLowSCI(int board){	int cnt;	IXJ *j = &ixj[board];	j->pld_scrr.byte = inb_p(j->XILINXbase);	if (j->pld_scrr.bits.sci) {		for (cnt = 0; cnt < 10; cnt++) {			udelay(32);			j->pld_scrr.byte = inb_p(j->XILINXbase);			if (!(j->pld_scrr.bits.sci))				return 1;		}		if (ixjdebug > 1)			printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte);		return 0;	} else		return 1;}static int SCI_Control(int board, int control){	IXJ *j = &ixj[board];	switch (control) {	case SCI_End:		j->pld_scrw.bits.c0 = 0;	// Set PLD Serial control interface		j->pld_scrw.bits.c1 = 0;	// to no selection 		break;	case SCI_Enable_DAA:		j->pld_scrw.bits.c0 = 1;	// Set PLD Serial control interface		j->pld_scrw.bits.c1 = 0;	// to write to DAA		break;	case SCI_Enable_Mixer:		j->pld_scrw.bits.c0 = 0;	// Set PLD Serial control interface		j->pld_scrw.bits.c1 = 1;	// to write to mixer 		break;	case SCI_Enable_EEPROM:		j->pld_scrw.bits.c0 = 1;	// Set PLD Serial control interface		j->pld_scrw.bits.c1 = 1;	// to write to EEPROM 		break;	default:		return 0;		break;	}	outb_p(j->pld_scrw.byte, j->XILINXbase);	switch (control) {	case SCI_End:		return 1;		break;	case SCI_Enable_DAA:	case SCI_Enable_Mixer:	case SCI_Enable_EEPROM:		if (!SCI_WaitHighSCI(board))			return 0;		break;	default:		return 0;		break;	}	return 1;}static int SCI_Prepare(int board){	if (!SCI_Control(board, SCI_End))		return 0;	if (!SCI_WaitLowSCI(board))		return 0;	return 1;}static int ixj_mixer(long val, int board){	BYTES bytes;	IXJ *j = &ixj[board];	bytes.high = (val & 0xFF00) >> 8;	bytes.low = val & 0x00FF;	outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03);	// Load Mixer Address	outb_p(bytes.low, j->XILINXbase + 0x02);	// Load Mixer Data	SCI_Control(board, SCI_Enable_Mixer);	SCI_Control(board, SCI_End);	return 0;}static int daa_load(BYTES * p_bytes, int board){	IXJ *j = &ixj[board];	outb_p(p_bytes->high, j->XILINXbase + 0x03);	outb_p(p_bytes->low, j->XILINXbase + 0x02);	if (!SCI_Control(board, SCI_Enable_DAA))		return 0;	else		return 1;}static int ixj_daa_cr4(int board, char reg){	IXJ *j = &ixj[board];	BYTES bytes;	switch (j->daa_mode) {	case SOP_PU_SLEEP:		bytes.high = 0x14;		break;	case SOP_PU_RINGING:		bytes.high = 0x54;		break;	case SOP_PU_CONVERSATION:		bytes.high = 0x94;		break;	case SOP_PU_PULSEDIALING:		bytes.high = 0xD4;		break;	}	switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {	case 0:		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;		break;	case 1:		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;		break;	case 2:		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;		break;	case 3:		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;		break;	}	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;	if (!daa_load(&bytes, board))		return 0;	if (!SCI_Prepare(board))		return 0;	return 1;}static char daa_int_read(int board){	BYTES bytes;	IXJ *j = &ixj[board];	if (!SCI_Prepare(board))		return 0;	bytes.high = 0x38;	bytes.low = 0x00;	outb_p(bytes.high, j->XILINXbase + 0x03);	outb_p(bytes.low, j->XILINXbase + 0x02);	if (!SCI_Control(board, SCI_Enable_DAA))		return 0;	bytes.high = inb_p(j->XILINXbase + 0x03);	bytes.low = inb_p(j->XILINXbase + 0x02);	if (bytes.low != ALISDAA_ID_BYTE) {		if (ixjdebug > 0)			printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);		return 0;	}	if (!SCI_Control(board, SCI_Enable_DAA))		return 0;	if (!SCI_Control(board, SCI_End))		return 0;	bytes.high = inb_p(j->XILINXbase + 0x03);	bytes.low = inb_p(j->XILINXbase + 0x02);	j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high;	return 1;}static int ixj_daa_cid_reset(int board){	int i;	BYTES bytes;	IXJ *j = &ixj[board];	if (!SCI_Prepare(board))		return 0;	bytes.high = 0x58;	bytes.low = 0x00;	outb_p(bytes.high, j->XILINXbase + 0x03);	outb_p(bytes.low, j->XILINXbase + 0x02);	if (!SCI_Control(board, SCI_Enable_DAA))		return 0;	if (!SCI_WaitHighSCI(board))		return 0;	for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) {		bytes.high = bytes.low = 0x00;		outb_p(bytes.high, j->XILINXbase + 0x03);		if (i < ALISDAA_CALLERID_SIZE - 1)			outb_p(bytes.low, j->XILINXbase + 0x02);		if (!SCI_Control(board, SCI_Enable_DAA))			return 0;		if (!SCI_WaitHighSCI(board))			return 0;	}	if (!SCI_Control(board, SCI_End))		return 0;	return 1;}static int ixj_daa_cid_read(int board){	int i;	BYTES bytes;	char CID[ALISDAA_CALLERID_SIZE], mContinue;	char *pIn, *pOut;	IXJ *j = &ixj[board];	if (!SCI_Prepare(board))		return 0;	bytes.high = 0x78;	bytes.low = 0x00;	outb_p(bytes.high, j->XILINXbase + 0x03);	outb_p(bytes.low, j->XILINXbase + 0x02);	if (!SCI_Control(board, SCI_Enable_DAA))		return 0;	if (!SCI_WaitHighSCI(board))		return 0;	bytes.high = inb_p(j->XILINXbase + 0x03);	bytes.low = inb_p(j->XILINXbase + 0x02);	if (bytes.low != ALISDAA_ID_BYTE) {		if (ixjdebug > 0)			printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);		return 0;	}	for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) {		bytes.high = bytes.low = 0x00;		outb_p(bytes.high, j->XILINXbase + 0x03);		outb_p(bytes.low, j->XILINXbase + 0x02);		if (!SCI_Control(board, SCI_Enable_DAA))			return 0;		if (!SCI_WaitHighSCI(board))			return 0;		CID[i + 0] = inb_p(j->XILINXbase + 0x03);		CID[i + 1] = inb_p(j->XILINXbase + 0x02);	}	if (!SCI_Control(board, SCI_End))		return 0;	pIn = CID;	pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;	mContinue = 1;	while (mContinue) {		if ((pIn[1] & 0x03) == 0x01) {			pOut[0] = pIn[0];		}		if ((pIn[2] & 0x0c) == 0x04) {			pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2);		}		if ((pIn[3] & 0x30) == 0x10) {			pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4);		}		if ((pIn[4] & 0xc0) == 0x40) {			pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);		} else {			mContinue = FALSE;		}		pIn += 5, pOut += 4;	}	memset(&j->cid, 0, sizeof(IXJ_CID));	pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;	pOut += 4;	strncpy(j->cid.month, pOut, 2);	pOut += 2;	strncpy(j->cid.day, pOut, 2);	pOut += 2;	strncpy(j->cid.hour, pOut, 2);	pOut += 2;	strncpy(j->cid.min, pOut, 2);	pOut += 3;	j->cid.numlen = *pOut;	pOut += 1;	strncpy(j->cid.number, pOut, j->cid.numlen);	pOut += j->cid.numlen + 1;	j->cid.namelen = *pOut;	pOut += 1;	strncpy(j->cid.name, pOut, j->cid.namelen);	ixj_daa_cid_reset(board);	return 1;}static char daa_get_version(int board){	BYTES bytes;	IXJ *j = &ixj[board];	if (!SCI_Prepare(board))		return 0;	bytes.high = 0x35;	bytes.low = 0x00;	outb_p(bytes.high, j->XILINXbase + 0x03);	outb_p(bytes.low, j->XILINXbase + 0x02);	if (!SCI_Control(board, SCI_Enable_DAA))		return 0;	bytes.high = inb_p(j->XILINXbase + 0x03);	bytes.low = inb_p(j->XILINXbase + 0x02);	if (bytes.low != ALISDAA_ID_BYTE) {		if (ixjdebug > 0)			printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);		return 0;	}	if (!SCI_Control(board, SCI_Enable_DAA))		return 0;	if (!SCI_Control(board, SCI_End))		return 0;	bytes.high = inb_p(j->XILINXbase + 0x03);	bytes.low = inb_p(j->XILINXbase + 0x02);	if (ixjdebug > 0)		printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low);	j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high;	return bytes.high;}static int daa_set_mode(int board, int mode){	// NOTE:	//      The DAA *MUST* be in the conversation mode if the	//      PSTN line is to be seized (PSTN line off-hook).	//      Taking the PSTN line off-hook while the DAA is in	//      a mode other than conversation mode will cause a	//      hardware failure of the ALIS-A part.	// NOTE:	//      The DAA can only go to SLEEP, RINGING or PULSEDIALING modes	//      if the PSTN line is on-hook.  Failure to have the PSTN line	//      in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE	//      ALIS-A part.	//	BYTES bytes;	IXJ *j = &ixj[board];	if (!SCI_Prepare(board))		return 0;	switch (mode) {	case SOP_PU_SLEEP:		j->pld_scrw.bits.daafsyncen = 0;	// Turn off DAA Frame Sync		outb_p(j->pld_scrw.byte, j->XILINXbase);		j->pld_slicw.bits.rly2 = 0;		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);		bytes.high = 0x10;		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;		daa_load(&bytes, board);		if (!SCI_Prepare(board))			return 0;		j->daa_mode = SOP_PU_SLEEP;		j->flags.pstn_ringing = 0;		j->pstn_sleeptil = jiffies + (hertz * 3);		break;	case SOP_PU_RINGING:		j->pld_scrw.bits.daafsyncen = 0;	// Turn off DAA Frame Sync		outb_p(j->pld_scrw.byte, j->XILINXbase);		j->pld_slicw.bits.rly2 = 0;		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);		bytes.high = 0x50;		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;		daa_load(&bytes, board);		if (!SCI_Prepare(board))			return 0;		j->daa_mode = SOP_PU_RINGING;		break;	case SOP_PU_CONVERSATION:		bytes.high = 0x90;		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;		daa_load(&bytes, board);		if (!SCI_Prepare(board))			return 0;		j->pld_slicw.bits.rly2 = 1;		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);		j->pld_scrw.bits.daafsyncen = 1;	// Turn on DAA Frame Sync		outb_p(j->pld_scrw.byte, j->XILINXbase);		j->daa_mode = SOP_PU_CONVERSATION;		j->flags.pstn_ringing = 0;		j->ex.bits.pstn_ring = 0;		break;	case SOP_PU_PULSEDIALING:		j->pld_scrw.bits.daafsyncen = 0;	// Turn off DAA Frame Sync		outb_p(j->pld_scrw.byte, j->XILINXbase);		j->pld_slicw.bits.rly2 = 0;		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);		bytes.high = 0xD0;		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;		daa_load(&bytes, board);		if (!SCI_Prepare(board))			return 0;		j->daa_mode = SOP_PU_PULSEDIALING;		break;	default:		break;	}	return 1;}static int ixj_daa_write(int board){	BYTES bytes;	IXJ *j = &ixj[board];	if (!SCI_Prepare(board))		return 0;	bytes.high = 0x14;	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;	if (!daa_load(&bytes, board))		return 0;	bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg;	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg;	if (!daa_load(&bytes, board))		return 0;	bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg;	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;	if (!daa_load(&bytes, board))		return 0;	if (!SCI_Prepare(board))		return 0;	bytes.high = 0x1F;	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;	if (!daa_load(&bytes, board))		return 0;	bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg;	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg;	if (!daa_load(&bytes, board))		return 0;	bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg;	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg;	if (!daa_load(&bytes, board))		return 0;	bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg;	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg;	if (!daa_load(&bytes, board))		return 0;	bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;	bytes.low = 0x00;	if (!daa_load(&bytes, board))		return 0;	if (!SCI_Prepare(board))		return 0;	bytes.high = 0x00;	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];	if (!daa_load(&bytes, board))		return 0;	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6];	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5];	if (!daa_load(&bytes, board))		return 0;	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4];	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3];	if (!daa_load(&bytes, board))		return 0;	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2];	bytes.low = j->m_DAAShadowRegs.COP

⌨️ 快捷键说明

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