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 + -
显示快捷键?