📄 hal.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 + -