📄 ixj.c
字号:
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 + -