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

📄 main.c

📁 另一个在mpc8272上产生usb sof帧的demo
💻 C
📖 第 1 页 / 共 2 页
字号:
}

#define INPUT_BITS  11
#define OUTPUT_BITS  5
#define ADDR_LEN 7
#define ENDP_LEN 4
//-------------------------------- end reverse8-----------------------------
// return 11-bit concatenation of 7-bit address and 4-bit endpoint
// assume 7-bit address, 4-bit endpoint
UHWORD addr_endp_cat(UBYTE addr, UBYTE endp)
{
    return((UHWORD)((reverse8(addr, ADDR_LEN) << 4) | reverse8(endp, ENDP_LEN)));
}
//-------------------------------- end addr_endp_cat------------------------
// crc5 -- return 5-bit crc5
// CRC5 Generating Polynomial:  x**5 + x**2 + 1
// ADDR Input:  7-bits LSB..MSB
// ENDP Input:  4-bits LSB..MSB
// Input to crc5 is concatenation:  <ADDR Input><ENDP Input>
// Output is 5-bit CRC5:  LSB..MSB
UBYTE crc5(UHWORD data)
{
UHWORD gen_poly = 0x5;             // Generating Polynomial
UBYTE the_crc5;  // the_crc5
int bit_pos_d;
int bit_pos_c;
UBYTE d_bit;
UBYTE c_bit;
    gen_poly = 0x5;             // Generating Polynomial
    the_crc5 = (1<<OUTPUT_BITS)-1;  // the_crc5
    bit_pos_d = INPUT_BITS-1;
    bit_pos_c = OUTPUT_BITS-1;
    while( bit_pos_d >= 0 )
    {
        d_bit = (((1<<bit_pos_d) & data) != 0);
        c_bit = (((1<<bit_pos_c) & the_crc5) != 0);
        data ^= d_bit << bit_pos_d;      // clear bit
        the_crc5 ^= c_bit << bit_pos_c;  // clear bit
        bit_pos_d--;
        the_crc5 <<= 1;
        if(d_bit != c_bit) the_crc5 ^= gen_poly;
    }
    the_crc5 ^= (1<<OUTPUT_BITS)-1;
    return the_crc5;
}
//-------------------------------- end crc5-----------------------------
void send_token(UBYTE token, UBYTE addr, UBYTE end_p)
{
UHWORD y;
UBYTE c_sum,by1,by2;
   y=addr_endp_cat(addr,end_p);
   c_sum=crc5(y);
   by1=reverse8(addr,8);
   by2=reverse8(end_p,8);
   if (by2 & 0x80) by1 |=1; 
   by2 <<=1;
   by2 |=c_sum;
   ep0_out[0][0]=reverse8(token,8);
   ep0_out[0][1]=reverse8(by1,8);
   ep0_out[0][2]=reverse8(by2,8);
	switch(token)
	{
		case IN_TOKEN:
			ep0_rxbd[0]->status = HW0+ HW2+HW3 ;
		
			ep0_txbd[0]->status = HW0+HW2+HW3+HW4+HW6 ;
			ep0_txbd[0]->length=3;
				fl_txb=0; fl_rxb=0;
				while(!(*ussft>max_sof_del)) {}
				reg_usb->uscom=0x80;  // start EP0
				while(! fl_txb) {}		
			if (reg_usb->usber & HW11)
			{
				if (ep0_txbd[0]->status & 4) flush_restart_ep(0);
			}
			else while(! fl_rxb) {}
		break;	
		case OUT_TOKEN:
			ep0_txbd[0]->length=3;
    	    ep0_txbd[0]->pointer = (UWORD )&ep0_out[0][0];  
			ep0_txbd[0]->status = HW0+HW3+HW4;
			
			ep0_txbd[1]->length=20;
    	    ep0_txbd[1]->pointer = (UWORD )&ep0_out[0][1];  
			ep0_txbd[1]->status = HW0+ HW2 +HW3+HW4 +HW5 +HW6 +HW8+HW9; // DATA1 PID must be; L, TC, CNF must be, 

				fl_txb=0;
				while(!(*ussft>max_sof_del)) {}
f_rxbd[1]->length = 0 ; 
f_rxbd[1]->pointer = (UWORD)&(fep_in[1][0]);
f_rxbd[1]->status = HW0 | HW2 ; 

				reg_usb->uscom=0x80;  // start EP0
				while(! fl_txb) {}
			if (reg_usb->usber & HW11)
			{
				if (ep0_txbd[0]->status & 4) flush_restart_ep(0);
				if (ep0_txbd[1]->status & 4) flush_restart_ep(0);
			}
		break;
		case SETUP_TOKEN:
			ep0_txbd[0]->status = HW0+HW4;
			ep0_txbd[0]->length=3;

			ep0_txbd[1]->status = HW0+ HW2 +HW3+HW4 +HW5 +HW6 +HW8+HW9; // DATA1 PID must be; L, TC, CNF must be, 
			ep0_txbd[1]->length=10;

	ep0_out[1][0]=0x80;
	ep0_out[1][1]=0;
	ep0_out[1][2]=0;	ep0_out[1][3]=0;
	ep0_out[1][4]=0;	ep0_out[1][5]=0;
	ep0_out[1][6]=0;	ep0_out[1][7]=2;

			reg_usb->uscom=0x80;  // start EP0
				fl_txb=0;
				while(!(*ussft>max_sof_del)) {}
				reg_usb->uscom=0x80;  // start EP0
				while(! fl_txb) {}
			if (reg_usb->usber & HW11)
			{
				if (ep0_txbd[0]->status & 4) flush_restart_ep(0);
				if (ep0_txbd[1]->status & 4) flush_restart_ep(0);
			}
		break;
	}	
}
//-------------------------------- end send_token-----------------------------
void test_usb_pins(void)
{
	immr->io_regs[PortD].ppar &=~W23;
	immr->io_regs[PortD].pdir |= W23;  // USBTxP to PD23; P1_A9

	immr->io_regs[PortD].ppar &=~W24;
	immr->io_regs[PortD].pdir |= W24;  // USBTxN to PD24; P1_A8
csr->bcsr3 &=~(W0 |W1); // USB enabled; high speed
		immr->io_regs[PortD].pdat &=~W23;
		immr->io_regs[PortD].pdat |= W23;
	while(1)
	{
		immr->io_regs[PortD].pdat |= W24;
		immr->io_regs[PortD].pdat &=~W24;
	}
}
//-----------------end test_usb_pins-----------------------------------
void enable_ex_irq(void)
{
register unsigned long gpr;
	asm( mfmsr  gpr ); 
	gpr |=W16;
	asm( mtmsr  gpr ); 
} 
//--------------------------------end init_ex_irq--------------------------------
void usb_interrupt_init(void)
{
	immr->ic_sipnr_l &=~W26;     // clear pend from CPM USB
	immr->ic_simr_l |= W26;     // unmasked CPM USB
	
	enable_ex_irq();        // set bits EE and RI in MSR
	reg_usb->usmer = HW12 | HW14 | HW15;
}
//-------------------------------- end usb_interrupt_init-----------------------------
void InterruptInit(UWORD *interrupt_vector, UWORD interrupt_code[])
{
UHWORD index;
UWORD *instruction;
UWORD *next_vector;
	next_vector=interrupt_vector;
   next_vector = (interrupt_vector + VECTOR_BLOCK_LEN); /* next vector entry */
   index = 0;
   for(instruction = interrupt_vector; instruction < next_vector; instruction++)
   {
      *instruction = interrupt_code[index];
      index++;
   }   
}
//--------------------------------end InterruptInit--------------------------------
void InterruptHandler(void)
{
}
//--------------------------------end InterruptHandler--------------------------------------
void DecIntHandler(void)
{
register unsigned long gpr;
	gpr=10000000;
	asm
	{
		mtspr SPR_DEC, gpr
	}
}
//----------------------end DecIntHandler------------------------
void ExtIntHandler(void)
{
UWORD sl_sivec;
UHWORD sh1;
UHWORD sl_usber;
    sl_sivec =immr->ic_sivec;   // sivec interrupt code 
    switch(sl_sivec)
    {
    	case 0x2C000000:  // This IRQ is the request from USB_8272
   		{
			sl_usber=reg_usb->usber;
			if (sl_usber & HW12) // SOF
			{
				sl_frame_n++;
				sl_frame_n &=0x7ff;
				sh1=(UHWORD)crc5(sl_frame_n);
				sh1 <<=11;
				sh1 |=sl_frame_n;
				pram_usb->frame_n=sh1;
				fl_sof=1;
				reg_usb->usber =HW12;  // clear SOF pending bit
			}		
			if (sl_usber & (HW14 | HW11)) // TxB
			{
				reg_usb->usber =HW14;  // clear TxB pending bit
				fl_txb=1;
			}	
   			if (sl_usber & HW15) // RxB
   			{
				reg_usb->usber =HW15;  // clear TxB pending bit
				fl_rxb=1;
			}
		}
		break;
	}		
} 
//-------------------------------- end ExtIntHandler --------------------------------
UHWORD sofgen (UHWORD frame)          //Generates SOF frame & CRC5
{
    return (UHWORD)((frame & 0x07ff) | (UHWORD)(crc5(frame) << 11));
}
//------------------end sofgen--------------------------------------------
// ussft is incremented up to 11999 (1us)
//------------------MAIN---------------------------------------------------------
void main()
{
	init_addr();
	InterruptInit((UWORD *) EXT_INT_VECTOR, Ex500); // Place External Interrupt Handler Code to Address 0x500 
	InterruptInit((UWORD *) DEC_INT_VECTOR, Ex900); // Place Decrementer Interrupt Handler Code to Address 0x900 
	
	max_sof_del=8000;
//test_usb_pins();
	
    csr->bcsr3 |= W0; // USB is disabled
    csr->bcsr3 &=~W2; // USB power is disabled

    csr->bcsr3 |=W3;
    csr->bcsr1 |=W2 + W4;
    	
	init_usb_host();

    csr->bcsr3 &=~(W0 |W1); // USB enabled; high speed

	pram_usb->frame_n=sofgen(0);
	enable_sof_generation();
	usb_interrupt_init();
  fl_sof=0; fl_txb=0; fl_rxb=0;
  
   while(1)
   {

		send_token(OUT_TOKEN,5,1);
//		setup_token();
//		in_token();
		
if (fl_sof)
{
//	csr->bcsr4 ^=W3;
	fl_sof=0;
}	    		
	sl1=reg_usb->usber;
	sl1=immr->ic_sipnr_l;
   }
}


⌨️ 快捷键说明

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