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

📄 main.c

📁 mpc2872系列的usb controller产生sof源码
💻 C
字号:
//////////////////////////////////////////////////////////////////
// This code demonstrates the minimal amount of configurations necessary to successfully generate SOFs.
// This example uses an MPC8272 mounted on an MPC8272ADS board.
// Board Configuration:
// 		SW5: 10100100
//		SW2: 0010
//		Input Clock:  100MHz
//		JP8:  Host
// 10/5/05 Randy Ryder
//////////////////////////////////////////////////////////////////


#include <stdio.h>
#include "mpc8272.h"

uword GetIMMR(void);
ushort reverse8(ushort input, int len);
uchar crc5(ushort frame);
ushort sofgen (ushort frame);

ushort reverse8(ushort input, int len)        //Reverse bit order
{
    int i;
    ushort the_reverse = 0;
    ushort the_bit;

    for(i=0;i<len;i++){
        the_bit = ((input & (1<<i)) != 0);
        the_reverse |= the_bit << ((len-1) - i);
    }

    return the_reverse;
}

uchar crc5(ushort frame)                        //CRC5 routine
{
    ushort  hold = 0x1f;
    ushort tmpFrameNum, frameMask = 0x0400;
    int i;
    tmpFrameNum = reverse8(frame, 11);

    for (i = 0; i < 11 ; i++)
    {
        hold = (ushort)(hold << 1);
        if (!!(tmpFrameNum & frameMask) != !!(hold & 0x20))
            hold ^= 0x5;

        frameMask = (ushort)(frameMask >> 1);
    }

    return (uchar)reverse8((ushort)(hold ^ 0x1f), 5);
}


ushort sofgen (ushort frame)          //Generates SOF frame & CRC5
{
    return (ushort)((frame & 0x07ff) | (ushort)(crc5(frame) << 11));
}


void main()
{
	typedef struct 
	{
		ushort status;
		ushort length;
		uword  point;
	} bd;
	
	uword  *bcsr3;
	t_endpt_Pram *eppram;
	bd *txbd;
	ushort frame;
	int i=0;
	
/*------------------------------------------*/
/* Declare pointer to Internal Memory Map	*/
/*------------------------------------------*/
	
	EPPC *immr = (EPPC *) (GetIMMR() & 0xffff0000);
	t_USB_Pram *usbpram = (t_USB_Pram *) immr->pram.standard.usb;
	bcsr3 = (uword *) ((immr->memc_regs[1].br & 0xFFFF0000) + 0xC);


/*************************************/
	/*  USB PARAMETER RAM INIT */

	usbpram->ep1ptr  = 0x8b40;
	usbpram->rstate  = 0x00000000;
	usbpram->frame_n = 0x0000;
	
/*************************************/
	
/*  ENDPOINT 0 PARAMETER BLOCK INIT */

	eppram = (t_endpt_Pram *) ((uword)usbpram->ep1ptr + (uword)immr);
	eppram->tbase  = 0x8b90;
	eppram->rfcr   = 0x18;
	eppram->tfcr   = 0x18;
	eppram->tstate = 0x00000000;
	eppram->himmr  = 0x0470;			// IMM is 0x0470 for this example

/**************************************/
		/*  TxBD Init  */
   
   	txbd = (bd *) ((uword)immr + (uword)eppram->tbase);
    txbd->status = 0x2a00;				// This is ex. of minimum BD init for EP0
    txbd->length = 0x0000;
    txbd->point  = 0x00000000;
    
/**************************************/

	/*  PARALLEL PORT CONFIG */
	immr->io_regs[2].ppar |= 0x00300880;
	immr->io_regs[2].pdir |= 0x00000800;
	immr->io_regs[2].psor |= 0x00000000;
	immr->io_regs[3].pdir |= 0x00000180;
	immr->io_regs[3].psor |= 0x00000000;
	immr->io_regs[3].ppar |= 0x000001c0;
	
/***************************************/

	/*  BOARD/DEVICE CONFIGURATION */
	
	*bcsr3  &= 0x01111111;				// put ADS in host mode, Vbus off, Full-speed

	immr->cpm_mux_cmxscr |= 0x00000700;
	immr->cpm_rccr 		 |= 0x00080040;
	immr->usep1			  = 0x0020;		// EP0 acts as the host    */


 /***************************************/  
  	
	immr->usmod |= 0x0b;                                

	while (1) 
	{

		for (frame = 0x0000; frame < 0x801;) // Loop between min & max frame count
		{
			if (immr->usber & 0x0008)		// Trigger on SOF transmission event to create frame & crc
			{
				usbpram->frame_n = sofgen(frame);
				frame++;
				immr->usber |= 0x0008;		// Clear event register
			}
		}
 	}
}

/*-----------------------------------------------------------------------------
*
* FUNCTION NAME: GetIMMR
*
* DESCRIPTION:
*
*     Returns the current value in IMMR register. The IMMR register must
*     be accessed in this manner because it is a special purpose register.
*
* EXTERNAL EFFECTS: None
*
* PARAMETERS: none
*
* RETURNS: IMMR value 
*-----------------------------------------------------------------------------*/
uword GetIMMR(void)
{
   register unsigned long gpr = 0;
   asm( mfspr gpr,311);
   return gpr;
}

⌨️ 快捷键说明

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