📄 hal4d12.c
字号:
//这是固件最底层的代码,可以完成硬件访问PDIUSBD12相关I/O口的功能
//*************************************************************************
//
// P H I L I P S P R O P R I E T A R Y
//
// COPYRIGHT (c) 1999 BY PHILIPS SINGAPORE.
// -- ALL RIGHTS RESERVED --
//
// File Name: Hal4D12.C
// Author: Hilbert Zhang ZhenYu
// Created: Nov. 19, 99
// Modified:
// Revision: 0.0.
//
//*************************************************************************
//
//*************************************************************************
#include "config.h" /* special function register declarations */
#undef GLOBAL_EXT
#include "SysCnfg.h"
#include "BasicTyp.h"
#include "common.h"
#include "Hal4Sys.h"
#include "Hal4d12.h"
//读取芯片ID
unsigned int readchipid(void)
{
unsigned char i;
int16 chipid;
Hal4Sys_D12CmdPortOutB(0xfd);
i = Hal4Sys_D12DataPortInB();
chipid = Hal4Sys_D12DataPortInB();
chipid = (chipid <<8) + i;
return chipid;
}
//*************************************************************************
// Functions
//*************************************************************************
void Hal4D12_SetAddressEnable(INT8 bAddress, uint8 bEnable) //设置地址使能
{
Hal4Sys_D12CmdPortOutB( 0xD0);
if(bEnable)
bAddress |= 0x80;
Hal4Sys_D12DataPortOutB( bAddress);
}
void Hal4D12_SetEndpointEnable(uint8 bEnable) //设置端点使能
{
Hal4Sys_D12CmdPortOutB( 0xD8);
if(bEnable)
Hal4Sys_D12DataPortOutB( 1);
else
Hal4Sys_D12DataPortOutB( 0);
}
void Hal4D12_SetMode(INT8 bConfig, INT8 bClkDiv) //设置模式
{
Hal4Sys_D12CmdPortOutB( 0xF3);
Hal4Sys_D12DataPortOutB( bConfig);//0x02
Hal4Sys_D12DataPortOutB( bClkDiv);//0x1f
}
void Hal4D12_SetDMA(INT8 bMode) //配置DMA
{
Hal4Sys_D12CmdPortOutB( 0xFB);
Hal4Sys_D12DataPortOutB( bMode);
}
void Hal4D12_ReadInterruptRegister( INT16 * pInterruptReg) //读中断继承器
{
Hal4Sys_D12CmdPortOutB( 0xF4);
((PFLEXI_INT16) pInterruptReg)->chars.c0 = Hal4Sys_D12DataPortInB();
((PFLEXI_INT16) pInterruptReg)->chars.c1 = Hal4Sys_D12DataPortInB();
}
INT8 Hal4D12_ReadLastTransactionStatus(INT8 bEndp) //读端点最后传输状态
{
Hal4Sys_D12CmdPortOutB( 0x40|bEndp);
return Hal4Sys_D12DataPortInB();
}
INT8 Hal4D12_SelectEndpoint(INT8 bEndp) //选择端点
{
Hal4Sys_D12CmdPortOutB( bEndp);
return Hal4Sys_D12DataPortInB();
}
/*
INT8 Hal4D12_ReadEndpointStatus(INT8 bEndp) //读端点状态
{
Hal4Sys_D12CmdPortOutB( 0x80|bEndp);
return Hal4Sys_D12DataPortInB();
}*/
void Hal4D12_SetEndpointStatus(INT8 bEndp, INT8 bStalled) //设置端点状态
{
Hal4Sys_D12CmdPortOutB( 0x40|bEndp);
Hal4Sys_D12DataPortOutB( bStalled);
}
/*
void Hal4D12_SendResume(void) // 发送恢复
{
Hal4Sys_D12CmdPortOutB( 0xF6);
}*/
INT8 Hal4D12_ReadEndpoint(INT8 endp, INT8 len, INT8 * buf) //读取端点缓冲区数据
{
int8 temp=0;
Hal4Sys_D12CmdPortOutB( endp); //选择端点
if((Hal4Sys_D12DataPortInB() & D12_FULLEMPTY) == 0)
{
return D12_FIFOEMPTY;
}
Hal4Sys_D12CmdPortOutB( 0xF0); //发读D12命令
Hal4Sys_D12DataPortInB();
if(endp==4)
{ endp = Hal4Sys_D12DataPortInB();
temp = 1;
}
else
endp = Hal4Sys_D12DataPortInB();
if( endp > len)
endp = len;
else
len = endp;
for(; endp != 0 ; endp--, buf++ )
*(buf) = Hal4Sys_D12DataPortInB();
if(temp)
temp=0;
Hal4Sys_D12CmdPortOutB( 0xF2); //缓冲区清零
return len ;
}
INT8 Hal4D12_ReadEPAtCode(INT8 endp, INT8 len) //读D12缓冲区到代码
{
// using endp, len, buf as var
Hal4Sys_D12CmdPortOutB( endp); //选择端点,返回端点状态
if((Hal4Sys_D12DataPortInB() & D12_FULLEMPTY) == 0)
{
return D12_FIFOEMPTY; //返回缓冲区空
}
Hal4Sys_D12CmdPortOutB( 0xF0); //发读数据指令
Hal4Sys_D12DataPortInB();
endp = Hal4Sys_D12DataPortInB(); //读取缓冲区数据字节大小
if( endp > len)
endp = len;
else
len = endp;
for(; endp != 0 ; endp-- ) //读取数据
Hal4Sys_D12DataPortInB();
Hal4Sys_D12CmdPortOutB( 0xF2); //清空缓冲区
return len ;
}
/*
void Hal4D12_ValidateBuffer(INT8 endp) // 使缓冲区有效
{
// Select Endpoint
Hal4Sys_D12CmdPortOutB( endp);
// Valiate Buffer
Hal4Sys_D12CmdPortOutB( 0xFA);
}
*/
/*
void Hal4D12_ClearBuffer(INT8 endp) //清除缓冲区
{
// Select Endpoint
Hal4Sys_D12CmdPortOutB( endp);
// Clear Buffer
Hal4Sys_D12CmdPortOutB( 0xF2);
}*/
//Amend by Liu Ying Bin
//INT8 Hal4D12_WriteEndpoint(INT8 endp, INT8 len, INT8 idata * buf)
INT8 Hal4D12_WriteEndpoint(INT8 endp, INT8 len, INT8 * buf) //发送缓冲区数据
{
Hal4Sys_D12CmdPortOutB( endp);
Hal4Sys_D12DataPortInB();
Hal4Sys_D12CmdPortOutB( 0xF0); // 发写D12缓冲区指令
if(endp==2)
while(1);
endp = len;
Hal4Sys_D12DataPortOutB( 0);
Hal4Sys_D12DataPortOutB( endp); // 写进数据长度
for( ; endp != 0; endp-- , buf++)
Hal4Sys_D12DataPortOutB( *(buf) );
Hal4Sys_D12CmdPortOutB( 0xFA); // 使缓冲区有效
return len;
}
INT8 Hal4D12_WriteEPAtCode(INT8 endp, INT8 len, INT8 * buf) //发送代码区数据
{
Hal4Sys_D12CmdPortOutB( endp); //选择端点
Hal4Sys_D12DataPortInB(); //
endp = len;
Hal4Sys_D12CmdPortOutB( 0xF0); //发写缓冲区命令
Hal4Sys_D12DataPortOutB( 0); //写每一字节(没效)
Hal4Sys_D12DataPortOutB( endp); //写每二字节,发送数据长度
for(; endp != 0; endp-- , buf++) //发送数据
Hal4Sys_D12DataPortOutB( *(buf) );
Hal4Sys_D12CmdPortOutB( 0xFA); // 使缓冲区有效
return len; // 返回已发送字节长度
}
void Hal4D12_AcknowledgeEndpoint(INT8 endp) //应答SETUP
{
Hal4Sys_D12CmdPortOutB( endp); //选择端点
Hal4Sys_D12CmdPortOutB( 0xF1); //发应答命令
if(endp == 0)
Hal4Sys_D12CmdPortOutB( 0xF2); //如果是端点零,则清缓冲区
}
void Hal4D12_SingleTransmitEP0(INT8 * buf, INT8 len)
{
Hal4D12_WriteEndpoint(1, len, buf);
}
void Hal4D12_AcknowledgeSETUP(void)
{
Hal4D12_AcknowledgeEndpoint(0);
Hal4D12_AcknowledgeEndpoint(1);
}
void Hal4D12_StallEP0(void)
{
Hal4D12_SetEndpointStatus(0, 1);
Hal4D12_SetEndpointStatus(1, 1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -