📄 s_4bri.c
字号:
IoAdapter->fpga_features |= PCINIT_FPGA_PLX_ACCESS_SUPPORTED ; } } DBG_LOG(("FPGA[%s] file %s (%s %s) len %d", fpgaType, fpgaFile, fpgaDate, fpgaTime, cnt)) return (File) ;}/******************************************************************************/#define FPGA_PROG 0x0001 /* PROG enable low */#define FPGA_BUSY 0x0002 /* BUSY high, DONE low */#define FPGA_CS 0x000C /* Enable I/O pins */#define FPGA_CCLK 0x0100#define FPGA_DOUT 0x0400#define FPGA_DIN FPGA_DOUT /* bidirectional I/O */int qBri_FPGA_download (PISDN_ADAPTER IoAdapter) { int bit ; byte *File ; dword code, FileLength ; word volatile __iomem *addr = (word volatile __iomem *)DIVA_OS_MEM_ATTACH_PROM(IoAdapter); word val, baseval = FPGA_CS | FPGA_PROG ; if (DIVA_4BRI_REVISION(IoAdapter)) { char* name; switch (IoAdapter->cardType) { case CARDTYPE_DIVASRV_B_2F_PCI: name = "dsbri2f.bit"; break; case CARDTYPE_DIVASRV_B_2M_V2_PCI: case CARDTYPE_DIVASRV_VOICE_B_2M_V2_PCI: name = "dsbri2m.bit"; break; default: name = "ds4bri2.bit"; } File = qBri_check_FPGAsrc (IoAdapter, name, &FileLength, &code); } else { File = qBri_check_FPGAsrc (IoAdapter, "ds4bri.bit", &FileLength, &code) ; } if ( !File ) { DIVA_OS_MEM_DETACH_PROM(IoAdapter, addr); return (0) ; }/* * prepare download, pulse PROGRAM pin down. */ WRITE_WORD(addr, baseval & ~FPGA_PROG) ; /* PROGRAM low pulse */ WRITE_WORD(addr, baseval) ; /* release */ diva_os_wait (50) ; /* wait until FPGA finished internal memory clear *//* * check done pin, must be low */ if ( READ_WORD(addr) & FPGA_BUSY ) { DBG_FTL(("FPGA download: acknowledge for FPGA memory clear missing")) xdiFreeFile (File) ; DIVA_OS_MEM_DETACH_PROM(IoAdapter, addr); return (0) ; }/* * put data onto the FPGA */ while ( code < FileLength ) { val = ((word)File[code++]) << 3 ; for ( bit = 8 ; bit-- > 0 ; val <<= 1 ) /* put byte onto FPGA */ { baseval &= ~FPGA_DOUT ; /* clr data bit */ baseval |= (val & FPGA_DOUT) ; /* copy data bit */ WRITE_WORD(addr, baseval) ; WRITE_WORD(addr, baseval | FPGA_CCLK) ; /* set CCLK hi */ WRITE_WORD(addr, baseval | FPGA_CCLK) ; /* set CCLK hi */ WRITE_WORD(addr, baseval) ; /* set CCLK lo */ } } xdiFreeFile (File) ; diva_os_wait (100) ; val = READ_WORD(addr) ; DIVA_OS_MEM_DETACH_PROM(IoAdapter, addr); if ( !(val & FPGA_BUSY) ) { DBG_FTL(("FPGA download: chip remains in busy state (0x%04x)", val)) return (0) ; } return (1) ;}static int load_qBri_hardware (PISDN_ADAPTER IoAdapter) { return (0);}/* -------------------------------------------------------------------------- Card ISR -------------------------------------------------------------------------- */static int qBri_ISR (struct _ISDN_ADAPTER* IoAdapter) { dword volatile __iomem *qBriIrq ; PADAPTER_LIST_ENTRY QuadroList = IoAdapter->QuadroList ; word i ; int serviced = 0 ; byte __iomem *p; p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter); if ( !(READ_BYTE(&p[PLX9054_INTCSR]) & 0x80) ) { DIVA_OS_MEM_DETACH_RESET(IoAdapter, p); return (0) ; } DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);/* * clear interrupt line (reset Local Interrupt Test Register) */ p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter); qBriIrq = (dword volatile __iomem *)(&p[DIVA_4BRI_REVISION(IoAdapter) ? (MQ2_BREG_IRQ_TEST) : (MQ_BREG_IRQ_TEST)]); WRITE_DWORD(qBriIrq, MQ_IRQ_REQ_OFF) ; DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p); for ( i = 0 ; i < IoAdapter->tasks; ++i ) { IoAdapter = QuadroList->QuadroAdapter[i] ; if ( IoAdapter && IoAdapter->Initialized && IoAdapter->tst_irq (&IoAdapter->a) ) { IoAdapter->IrqCount++ ; serviced = 1 ; diva_os_schedule_soft_isr (&IoAdapter->isr_soft_isr); } } return (serviced) ;}/* -------------------------------------------------------------------------- Does disable the interrupt on the card -------------------------------------------------------------------------- */static void disable_qBri_interrupt (PISDN_ADAPTER IoAdapter) { dword volatile __iomem *qBriIrq ; byte __iomem *p; if ( IoAdapter->ControllerNumber > 0 ) return ;/* * clear interrupt line (reset Local Interrupt Test Register) */ p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter); WRITE_BYTE(&p[PLX9054_INTCSR], 0x00); /* disable PCI interrupts */ DIVA_OS_MEM_DETACH_RESET(IoAdapter, p); p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter); qBriIrq = (dword volatile __iomem *)(&p[DIVA_4BRI_REVISION(IoAdapter) ? (MQ2_BREG_IRQ_TEST) : (MQ_BREG_IRQ_TEST)]); WRITE_DWORD(qBriIrq, MQ_IRQ_REQ_OFF) ; DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);}/* -------------------------------------------------------------------------- Install Adapter Entry Points -------------------------------------------------------------------------- */static void set_common_qBri_functions (PISDN_ADAPTER IoAdapter) { ADAPTER *a; a = &IoAdapter->a ; a->ram_in = mem_in ; a->ram_inw = mem_inw ; a->ram_in_buffer = mem_in_buffer ; a->ram_look_ahead = mem_look_ahead ; a->ram_out = mem_out ; a->ram_outw = mem_outw ; a->ram_out_buffer = mem_out_buffer ; a->ram_inc = mem_inc ; IoAdapter->out = pr_out ; IoAdapter->dpc = pr_dpc ; IoAdapter->tst_irq = scom_test_int ; IoAdapter->clr_irq = scom_clear_int ; IoAdapter->pcm = (struct pc_maint *)MIPS_MAINT_OFFS ; IoAdapter->load = load_qBri_hardware ; IoAdapter->disIrq = disable_qBri_interrupt ; IoAdapter->rstFnc = reset_qBri_hardware ; IoAdapter->stop = stop_qBri_hardware ; IoAdapter->trapFnc = qBri_cpu_trapped ; IoAdapter->diva_isr_handler = qBri_ISR; IoAdapter->a.io = (void*)IoAdapter ;}static void set_qBri_functions (PISDN_ADAPTER IoAdapter) { if (!IoAdapter->tasks) { IoAdapter->tasks = MQ_INSTANCE_COUNT; } IoAdapter->MemorySize = MQ_MEMORY_SIZE ; set_common_qBri_functions (IoAdapter) ; diva_os_set_qBri_functions (IoAdapter) ;}static void set_qBri2_functions (PISDN_ADAPTER IoAdapter) { if (!IoAdapter->tasks) { IoAdapter->tasks = MQ_INSTANCE_COUNT; } IoAdapter->MemorySize = (IoAdapter->tasks == 1) ? BRI2_MEMORY_SIZE : MQ2_MEMORY_SIZE; set_common_qBri_functions (IoAdapter) ; diva_os_set_qBri2_functions (IoAdapter) ;}/******************************************************************************/void prepare_qBri_functions (PISDN_ADAPTER IoAdapter) { set_qBri_functions (IoAdapter->QuadroList->QuadroAdapter[0]) ; set_qBri_functions (IoAdapter->QuadroList->QuadroAdapter[1]) ; set_qBri_functions (IoAdapter->QuadroList->QuadroAdapter[2]) ; set_qBri_functions (IoAdapter->QuadroList->QuadroAdapter[3]) ;}void prepare_qBri2_functions (PISDN_ADAPTER IoAdapter) { if (!IoAdapter->tasks) { IoAdapter->tasks = MQ_INSTANCE_COUNT; } set_qBri2_functions (IoAdapter->QuadroList->QuadroAdapter[0]) ; if (IoAdapter->tasks > 1) { set_qBri2_functions (IoAdapter->QuadroList->QuadroAdapter[1]) ; set_qBri2_functions (IoAdapter->QuadroList->QuadroAdapter[2]) ; set_qBri2_functions (IoAdapter->QuadroList->QuadroAdapter[3]) ; }}/* -------------------------------------------------------------------------- */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -