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

📄 hal.c

📁 ISP1362 Fat32 coldfire523x
💻 C
字号:
#include"hal.h"
#include "Request.h"
#include "Bulk.h"
#include "Api32.h"
#include "Fat32.h"
#include "m523xevb.h"
//#define LEDADDR	0x10011110			//A16=1 
 
SFLAGS bFlags;

void Delay_1ms(uint32 t)
{
	uint32 i, j;
	for (j = 0; j < t; j++)
	{
		for(i = 0; i < 10000UL; i++){}
	}
}

void Delay_100ns(uint32 t)
{
    uint32 i;

    for(i = 0; i < t*10; i++)
    {
        asm("nop");	
    }
}						   

void ISP1362Reg32Write(uint16 regaddr, uint32 data)
{
	uint32 uValue, uValue1;

	HC_COMMAND_PORT = (uint16)(regaddr | 0x80);
	Delay_100ns(2);
	uValue  = data & 0x0000ffff;
	HC_DATA_PORT = (uint16)uValue;
	Delay_100ns(0);
	uValue1 = (data & 0xffff0000) >> 16;
	HC_DATA_PORT = (uint16)uValue1;

}

uint32 ISP1362Reg32Read(uint16 regaddr)
{
	uint32 uValue, uValue1, uData;

	HC_COMMAND_PORT = regaddr;
	Delay_100ns(2);
	uValue  = HC_DATA_PORT;
	uData = uValue & 0x0000ffff;
	Delay_100ns(0);
	uValue1 = HC_DATA_PORT;
	uData |= ((uValue1 & 0x0000ffff) << 16);

	return uData;
}

void ISP1362Reg16Write(uint16 regaddr, uint16 data)
{
	HC_COMMAND_PORT = (regaddr | 0x80);
	Delay_100ns(2);
	HC_DATA_PORT = data;
}

uint16 ISP1362Reg16Read(uint16 regaddr)
{
	uint16 uData;

	HC_COMMAND_PORT = regaddr;
	Delay_100ns(2);
  	uData = HC_DATA_PORT;

	return uData;
}

void WriteATLIndirect(uint16 * pBufAddr, uint16 TotalBytes)
{
	volatile uint16 * pWord;
	uint16 TotalWords;

	pWord = (volatile uint16 *)pBufAddr;
	TotalWords = (TotalBytes >> 1);
	
	ISP1362Reg16Write(HC_TRANSFERCOUNTER, TotalBytes);
	HC_COMMAND_PORT = (HC_ATLBUFFERPORT | 0x80);
	Delay_100ns(5);

	do
	{
		HC_DATA_PORT = *(pWord++);
		TotalWords--;
	}while(TotalWords != 0);

	return ;
} 

void ReadATLIndirect(uint16 * pBufAddr, uint16 TotalBytes)
{
	volatile uint16 * pWord;
	uint16 TotalWords;

	pWord = (volatile uint16 *)pBufAddr;
	TotalWords = (TotalBytes >> 1);
	
	ISP1362Reg16Write(HC_TRANSFERCOUNTER, TotalBytes);
	HC_COMMAND_PORT = HC_ATLBUFFERPORT;
	Delay_100ns(5);

	do
	{
		*(pWord++) = HC_DATA_PORT;
		TotalWords--;
	}while(TotalWords != 0);

	return ;
}

void WriteATLDirect(uint16 * pBufAddr, uint16 StartAddr, uint16 TotalBytes)
{
    volatile uint16 * pWord;
	uint16 TotalWords;
	uint32 RegValue;

	pWord = (volatile uint16 *)pBufAddr;
	StartAddr &= 0x0FFE;
	RegValue = (uint32)(StartAddr & 0x7FFF);
	RegValue |= (((uint32)TotalBytes) << 16);
	TotalWords = (TotalBytes >> 1);
	
	ISP1362Reg32Write(Hc_DirectAddressLength, RegValue);
	HC_COMMAND_PORT = (Hc_DirectAddressDataPort | 0x80);
	Delay_100ns(4);

	do
	{
		HC_DATA_PORT = *(pWord++);
		TotalWords--;
	}while(TotalWords != 0);

	return ;
} 

void ReadATLDirect(uint16 * pBufAddr, uint16 StartAddr, uint16 TotalBytes)
{
    volatile uint16 * pWord;
	uint16 TotalWords, Temp;
	uint32 RegValue;

	pWord = (volatile uint16 *)pBufAddr;
	StartAddr &= 0x0FFE;
	RegValue = (uint32)(StartAddr & 0x7FFF);
	RegValue |= (((uint32)TotalBytes) << 16);
	TotalWords = (TotalBytes >> 1);
	
	ISP1362Reg32Write(Hc_DirectAddressLength, RegValue);
	HC_COMMAND_PORT = Hc_DirectAddressDataPort;
	Delay_100ns(4);

	do
	{
		Temp = HC_DATA_PORT;
		*(pWord++) = WordSwap(Temp);
		TotalWords--;
	}while(TotalWords != 0);

	return ;
}

void SwapWriteATLDirect(uint16 * pBufAddr, uint16 StartAddr, uint16 TotalBytes)
{
    volatile uint16 * pWord;
	uint16 TotalWords, Temp;
	uint32 RegValue;

	pWord = (volatile uint16 *)pBufAddr;
	StartAddr &= 0x0FFE;
	RegValue = (uint32)(StartAddr & 0x7FFF);
	RegValue |= (((uint32)TotalBytes) << 16);
	TotalWords = (TotalBytes >> 1);
	
	ISP1362Reg32Write(Hc_DirectAddressLength, RegValue);
	HC_COMMAND_PORT = (Hc_DirectAddressDataPort | 0x80);
	Delay_100ns(4);

	do
	{
		Temp = *(pWord++);
		HC_DATA_PORT = WordSwap(Temp);
		TotalWords--;
	}while(TotalWords != 0);

	return ;
} 

void ActiveATLPTD(void)
{
	uint16 u;

	u = ISP1362Reg16Read(HC_BUFFERSTATUS);
	ISP1362Reg16Write(HC_BUFFERSTATUS, (u | 0x0008));
}

void ResetPairedPTD(void)
{
	uint16 u;

	u = ISP1362Reg16Read(HC_BUFFERSTATUS);
	ISP1362Reg16Write(HC_BUFFERSTATUS, (u & 0xFFF7));
	ISP1362Reg16Write(HC_BUFFERSTATUS, (u | 0x0010));
	Delay_100ns(1);
	ISP1362Reg16Write(HC_BUFFERSTATUS, 0x0000);

}

void ISP1362SoftwareReset(void)
{
	uint32 uValue;
	uValue = 0xF6;

	ISP1362Reg16Write(HC_SOFTWARERESET, uValue);
//	Delay_1ms(10);
}

void ISP1362SuspendDevice(void)
{
	uint32 uValue;

	uValue = ISP1362Reg32Read(HC_CONTROL);/* 设置HC为挂起态,关闭内部时钟 */
	uValue &= ~0x00C0;
	uValue |= 0x00C0;
	ISP1362Reg32Write(HC_CONTROL, uValue);	
}

void ISP1362SetDeviceInOperational(void)
{
	uint32 uValue;

	uValue = ISP1362Reg32Read(HC_CONTROL);/* 设置HC为可操作态,开始产生SOF帧 */
	uValue &= ~0x00C0;
	uValue |= 0x0680;
	ISP1362Reg32Write(HC_CONTROL, uValue);	
}

void USBIntPinDisable(void)
{
	uint32 wValue;

	wValue = ISP1362Reg16Read(HC_HARDWARECONFIG);
	wValue &= ~0x0001;
	ISP1362Reg16Write(HC_HARDWARECONFIG, wValue);
	
}

void USBIntPinEnable(void)
{
	uint32 wValue;

	wValue = ISP1362Reg16Read(HC_HARDWARECONFIG);
	wValue |= 0x0001;
	ISP1362Reg16Write(HC_HARDWARECONFIG, wValue);
	
}

void ISP1362Init(void)
{
	uint32 uValue;

	/******************初始化标志位******************/
	bFlags.SLAVE_ONLINE = FALSE;
	bFlags.SLAVE_FOUND = FALSE;
	bFlags.SLAVE_REMOVED=FALSE;
	
	bFlags.SLAVE_ENUMERATED = FALSE;
	bFlags.SLAVE_ATTACHED = FALSE;
//	bFlags.SLAVE_ENUM_ERROR = FALSE;
	/************************************************/

	ISP1362SoftwareReset();

	uValue = ISP1362Reg32Read(HC_COMMAMDSTATUS); 	/* 复位bit0: HCR */
	uValue |= 0x00000001;
	ISP1362Reg32Write(HC_COMMAMDSTATUS, uValue);
	while(ISP1362Reg32Read(HC_COMMAMDSTATUS) & 0x0001);	

	/* 设置HC为可操作态,开始产生SOF帧 */
	ISP1362SetDeviceInOperational();	
  //  uValue = ISP1362Reg32Read(HC_CONTROL);

	uValue = ISP1362Reg16Read(HC_HARDWARECONFIG);	/* 中断特性配置,低电平边延触发,并使能全局中断INT1 */
	uValue |= 0x300A;
	ISP1362Reg16Write(HC_HARDWARECONFIG, uValue);

	/* 中断配置 */

	ISP1362Reg16Write(HC_uPINTERRUPT, 0xFFFF);		
	ISP1362Reg16Write(HC_uPINTERRUPTENABLE,0x0010);	/* 仅保留bit4: OPRint*/
	ISP1362Reg32Write(HC_INTERRUPTDISABLE, 0xFFFFFFFF);
	ISP1362Reg32Write(HC_INTERRUPTENABLE, 0x80000048);/* 配置MIE,使能寄存器其他位特定中断事件 */

	/* root hub配置 */
	uValue = ISP1362Reg32Read(HC_RHDESCRIPTORA);
	ISP1362Reg32Write(HC_RHDESCRIPTORA, ((POWERONTOPOWERGOODTIME / 2) << 24) | 0x1202);
	//uValue = ISP1362Reg32Read(HC_RHDESCRIPTORA);

	uValue = ISP1362Reg32Read(HC_RHDESCRIPTORB);
	ISP1362Reg32Write(HC_RHDESCRIPTORB, 0x00000000);
	//uValue = ISP1362Reg32Read(HC_RHDESCRIPTORB);

	uValue = ISP1362Reg32Read(HC_RHSTATUS);
	uValue |= 0x00018000;						/* 此处必须置位DRWE,否则不会产生从Suspend到Resume的跳变 */
	ISP1362Reg32Write(HC_RHSTATUS, uValue);
	//uValue = ISP1362Reg32Read(HC_RHSTATUS);

	/* frame interval配置 */
	ISP1362Reg32Write(HC_FMINTERVAL, FRAMEINTERVAL | (FSLARGESTDATAPACKET << 16));	 
	/* 缓冲区长度设置 */
	ISP1362Reg16Write(Hc_ISTLBufferSize, Hc_ISTLBufferLen);	 
	ISP1362Reg16Write(Hc_INTLBufferSize, Hc_INTLBufferLen);	 
	ISP1362Reg16Write(Hc_ATLBufferSize,  Hc_ATLBufferLen);	 
    ISP1362Reg16Write(Hc_ATLPTDDoneThresholdCount, 0x0001);//
    ISP1362Reg16Write(Hc_ATLPTDDoneThresholdTimeOut, 0x0003);//SMALLER
	ISP1362Reg16Write(Hc_ATLBlkSize, Hc_ATLBlkLen);
    /* ISP1362初始化完成后就挂起主机,用U盘远程唤醒*/ 
	//ISP1362SuspendDevice();
}
/*返回值说明   -2: 传输中错,-1:设备移出或不在线,0:枚举错,1:可用,2:枚举过*/
int8 CheckDevice()
{
  uint32 insert_remove, uValue;
  
  /*至少等待100ms使插入完成, 再进行枚举*/
//  Delay_1ms(100);

  insert_remove = ISP1362Reg32Read(HC_RHPORTSTATUS2);

  /* if hub suspented */
  if(((insert_remove >> 2) & 0x0001) == 1)
  {	
    do									   
    {
      insert_remove |= 0x0100;
      ISP1362Reg32Write(HC_RHPORTSTATUS2, insert_remove);
    }while((ISP1362Reg32Read(HC_RHPORTSTATUS2) >> 18) == 0); /*恢复序列完成PortSuspendStatusChange置位 */
 
    do
    {
      insert_remove = ISP1362Reg32Read(HC_RHPORTSTATUS2);
    }while(((insert_remove >> 2) & 0x0001) == 1);
	
    uValue = ISP1362Reg32Read(HC_CONTROL);/* 设置HC为可操作态 */
    uValue &= ~0x00C0;
    uValue |= 0x0080;
    ISP1362Reg32Write(HC_CONTROL, uValue);	
  }

  insert_remove = ISP1362Reg32Read(HC_RHPORTSTATUS2);
  if(((insert_remove & 0x00010000) >> 16) == 1)
  {	
    /* clear ConnectStatusChange bit(bit16) 1-CSC changed; 0-CSC has not changed;*/
    ISP1362Reg32Write(HC_RHPORTSTATUS2, (insert_remove | 0x00010000));
	
    if((insert_remove & 0x0001) == 1)
    {
      /* reset Device(Hub) */
      insert_remove |= 0x0010;								  
      ISP1362Reg32Write(HC_RHPORTSTATUS2, insert_remove);
      do
      {
        insert_remove = ISP1362Reg32Read(HC_RHPORTSTATUS2);
      }while(((insert_remove >> 20) & 0x0001) == 0);
    }
    /* set flags */
    if(bFlags.SLAVE_ONLINE == TRUE)
    {
      bFlags.SLAVE_REMOVED = TRUE;
      bFlags.SLAVE_ONLINE = FALSE;
      bFlags.SLAVE_FOUND = FALSE;
    }
    else	
    {
      bFlags.SLAVE_REMOVED = FALSE;
      bFlags.SLAVE_FOUND = TRUE;
      bFlags.SLAVE_ONLINE = TRUE;
      bFlags.SLAVE_ENUMERATED = FALSE;
    }
  }
  
	if(bFlags.SLAVE_FOUND)
	{
        if(! bFlags.SLAVE_ENUMERATED)
        {
            if(EnumUSBDev())
            {
                bFlags.SLAVE_ENUMERATED = TRUE;										
  				if(bFlags.SLAVE_MASSDEVICE)
   				{
   				    if(GetDecBPBInfo())
   				    {
   				        bFlags.SLAVE_ATTACHED = TRUE;
   			            return 1;											
   				    }
   				}
            }
			else
			{
 				bFlags.SLAVE_MASSDEVICE = FALSE;
 				bFlags.SLAVE_ENUMERATED = FALSE;
   				bFlags.SLAVE_ATTACHED   = FALSE;
				return 0;
			}
		}
		else
		{
		//    bFlags.SLAVE_ATTACHED = FALSE;
		    return 2; 
		}
	}
	if(bFlags.SLAVE_REMOVED)
	{
		bFlags.SLAVE_FOUND = FALSE;
		bFlags.SLAVE_ENUMERATED = FALSE;
		bFlags.SLAVE_ATTACHED = FALSE;
		bFlags.SLAVE_REMOVED = FALSE;

		return -1;
	}

	if(bFlags.ERROR)
	{
		bFlags.ERROR = FALSE;
		bFlags.SLAVE_FOUND = FALSE;
		bFlags.SLAVE_ENUMERATED = FALSE;
		bFlags.SLAVE_ATTACHED = FALSE;
		bFlags.SLAVE_REMOVED = TRUE;

		return -2;
	}

    return -1;
}


/*uint16 WordSwap(uint16 input)
{
	return(((input & 0x00FF) << 8)|((input & 0xFF00) >> 8));
}*/
uint16 LSwapuint16(uint16 dData1,uint16 dData2)
{
    uint16  dData;
    dData = ((dData2 << 8) & 0xff00) | (dData1 & 0x00ff);
	return dData;
}

uint32 LSwapuint32(uint32 dData1,uint32 dData2,uint32 dData3,uint32 dData4)
{
    uint32  dData;
    dData = ((dData4<<24)&0xff000000)|((dData3<<16)&0xff0000)|((dData2<<8)&0xff00)|(dData1&0xff);
	return dData;
}


⌨️ 快捷键说明

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