s_4bri.c
来自「优龙2410linux2.6.8内核源代码」· C语言 代码 · 共 1,008 行 · 第 1/3 页
C
1,008 行
end_addr = ((dword)tmp[0]) | (((dword)tmp[1]) << 8) | (((dword)tmp[2]) << 16) | (((dword)tmp[3]) << 24); DBG_TRC(("Image [%s] end = %08lx", task, end_addr)) phys_start_addr = start_addr & 0x1fffffff; if ((phys_start_addr + FileLength) >= BaseIoAdapter->MemorySize) { OsCloseFile (fp) ; DBG_ERR(("Image [%s] too long", task)) return (0); } fp->sysFileSeek (fp, 0, OS_SEEK_SET); p = DIVA_OS_MEM_ATTACH_RAM(BaseIoAdapter); sharedRam = &p[phys_start_addr]; if ((dword)fp->sysFileRead (fp, sharedRam, FileLength) != FileLength) { DIVA_OS_MEM_DETACH_RAM(BaseIoAdapter, p); OsCloseFile (fp) ; DBG_ERR(("Can't read image [%s]", task)) return (0); } DIVA_OS_MEM_DETACH_RAM(BaseIoAdapter, p); OsCloseFile (fp) ; } p = DIVA_OS_MEM_ATTACH_RAM(BaseIoAdapter); if (!link_addr) { link_addr = &p[OFFS_DSP_CODE_BASE_ADDR]; } DBG_TRC(("Write task [%s] link %08lx at %08lx", task ? task : "none", start_addr, link_addr - (byte*)&BaseIoAdapter->ram[0])) link_addr[0] = (byte)(start_addr & 0xff); link_addr[1] = (byte)((start_addr >> 8) & 0xff); link_addr[2] = (byte)((start_addr >> 16) & 0xff); link_addr[3] = (byte)((start_addr >> 24) & 0xff); DIVA_OS_MEM_DETACH_RAM(BaseIoAdapter, p); return (task ? &sharedRam[DIVA_MIPS_TASK_IMAGE_LINK_OFFS] : 0);}/* -------------------------------------------------------------------------- Load Card -------------------------------------------------------------------------- */static int load_qBri_hardware (PISDN_ADAPTER IoAdapter) { dword i, offset, controller ; word *signature ; int factor = (IoAdapter->tasks == 1) ? 1 : 2; byte *p; PISDN_ADAPTER Slave ; if ( !IoAdapter->QuadroList || ( (IoAdapter->cardType != CARDTYPE_DIVASRV_Q_8M_PCI) && (IoAdapter->cardType != CARDTYPE_DIVASRV_VOICE_Q_8M_PCI) && (IoAdapter->cardType != CARDTYPE_DIVASRV_Q_8M_V2_PCI) && (IoAdapter->cardType != CARDTYPE_DIVASRV_VOICE_Q_8M_V2_PCI) && (IoAdapter->cardType != CARDTYPE_DIVASRV_B_2M_V2_PCI) && (IoAdapter->cardType != CARDTYPE_DIVASRV_VOICE_B_2M_V2_PCI) && (IoAdapter->cardType != CARDTYPE_DIVASRV_B_2F_PCI) ) ) { return (0) ; }/* * Check for first instance */ if ( IoAdapter->ControllerNumber > 0 ) return (1) ;/* * first initialize the onboard FPGA */ if ( !qBri_FPGA_download (IoAdapter) ) return (0) ; for ( i = 0; i < IoAdapter->tasks; i++ ) { Slave = IoAdapter->QuadroList->QuadroAdapter[i] ; Slave->fpga_features = IoAdapter->fpga_features ; }/* * download protocol code for all instances */ controller = IoAdapter->tasks; do { controller-- ; i = 0 ; while ( IoAdapter->QuadroList->QuadroAdapter[i]->ControllerNumber != controller ) i++ ;/* * calculate base address for instance */ Slave = IoAdapter->QuadroList->QuadroAdapter[i] ; offset = Slave->ControllerNumber * (IoAdapter->MemorySize >> factor) ; Slave->Address = &IoAdapter->Address[offset] ; Slave->ram = &IoAdapter->ram[offset] ; Slave->reset = IoAdapter->reset ; Slave->ctlReg = IoAdapter->ctlReg ; Slave->prom = IoAdapter->prom ; Slave->Config = IoAdapter->Config ; Slave->Control = IoAdapter->Control ; if ( !qBri_protocol_load (IoAdapter, Slave) ) return (0) ; } while (controller != 0) ;/* * download only one copy of the DSP code */ if (IoAdapter->cardType != CARDTYPE_DIVASRV_B_2F_PCI) { if ( !qBri_telindus_load (IoAdapter) ) return (0) ; } else { byte* link_addr = 0; link_addr = qBri_sdp_load (IoAdapter, DIVA_BRI2F_SDP_1_NAME, link_addr); link_addr = qBri_sdp_load (IoAdapter, DIVA_BRI2F_SDP_2_NAME, link_addr); if (!link_addr) { qBri_sdp_load (IoAdapter, 0, link_addr); } }/* * copy configuration parameters */ for ( i = 0 ; i < IoAdapter->tasks ; ++i ) { Slave = IoAdapter->QuadroList->QuadroAdapter[i] ; Slave->ram += (IoAdapter->MemorySize >> factor) - MQ_SHARED_RAM_SIZE ; p = DIVA_OS_MEM_ATTACH_RAM(Slave); DBG_TRC(("Configure instance %d shared memory @ 0x%08lx", Slave->ControllerNumber, p)) memset (p, '\0', 256) ; DIVA_OS_MEM_DETACH_RAM(Slave, p); diva_configure_protocol (Slave); }/* * start adapter */ start_qBri_hardware (IoAdapter) ; p = DIVA_OS_MEM_ATTACH_RAM(IoAdapter); signature = (word *)(&p[0x1E]) ;/* * wait for signature in shared memory (max. 3 seconds) */ for ( i = 0 ; i < 300 ; ++i ) { diva_os_wait (10) ; if ( signature[0] == 0x4447 ) { DIVA_OS_MEM_DETACH_RAM(IoAdapter, p); DBG_TRC(("Protocol startup time %d.%02d seconds", (i / 100), (i % 100) )) return (1) ; } } DIVA_OS_MEM_DETACH_RAM(IoAdapter, p); DBG_FTL(("%s: Adapter selftest failed (0x%04X)!", IoAdapter->Properties.Name, signature[0] >> 16)) qBri_cpu_trapped (IoAdapter) ; return (FALSE) ;}#else /* } { */static int load_qBri_hardware (PISDN_ADAPTER IoAdapter) { return (0);}#endif /* } *//* -------------------------------------------------------------------------- Card ISR -------------------------------------------------------------------------- */static int qBri_ISR (struct _ISDN_ADAPTER* IoAdapter) { dword volatile *qBriIrq ; PADAPTER_LIST_ENTRY QuadroList = IoAdapter->QuadroList ; word i ; int serviced = 0 ; byte *p; p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter); if ( !(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 *)(&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 *qBriIrq ; byte *p; if ( IoAdapter->ControllerNumber > 0 ) return ;/* * clear interrupt line (reset Local Interrupt Test Register) */ p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter); p[PLX9054_INTCSR] = 0x00 ; /* disable PCI interrupts */ DIVA_OS_MEM_DETACH_RESET(IoAdapter, p); p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter); qBriIrq = (dword volatile *)(&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 + =
减小字号Ctrl + -
显示快捷键?