📄 d12driver.asm
字号:
#include "PDIUSBD12.h"
#include "defBF531.h"
.global bEnable,bAddress,bEndp,bStalled,bLen,pBuf;
.section SECTION_Data; //8bit width, total size: 16K Byte
.align 4;
.byte4 bAddress;
.byte4 bEnable;
.byte4 bEndp;
.byte4 bStalled;
.byte4 bLen;
.byte4 pBuf;
.section SECTION_Code2;
/*********************************************************************
** 函数名称: InitD12()
** 功能描述: 设置D12与硬件的连接, 初始化D12, 复位D12
** 输 入: 无
** 输 出: 0: 初始化成功 1: 初始化失败 ,存于D12Data
**********************************************************************/
.global InitD12;
InitD12:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
[ --SP ]=r1; //push r1
call ReConnectD12;
call ReadChipID;
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0=[p0];
r1=0x1012;
cc=r0==r1;
if !cc jump InitFail;
r0=1;
jump InitD12_Exit;
InitFail:
r0=0;
InitD12_Exit:
[p0]=r0;
r1=[ SP++ ]; //pop r1
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
InitD12.end:
/*******************************************************************
** 函数名称: UsbServe()
** 功能描述: USB事件处理函数
** 输 入: 无
** 输 出: 无
********************************************************************/
.global UsbServe;
UsbServe:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
UsbServe.end:
/*******************************************************************
** 函数名称: Ep1_TxDone()
** 功能描述: 端点1 IN(发送)处理处理函数
** 输 入: 无
** 输 出: 无
********************************************************************/
.global Ep1_TxDone;
Ep1_TxDone:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
p0.l=lo(bEndp);
p0.h=hi(bEndp);
r0=0x3;
[p0]=r0;
call ReadLastTransactionStatus;
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
Ep1_TxDone.end:
/*******************************************************************
** 函数名称: Ep1_RxDone()
** 功能描述: 端点1 OUT(接收)处理处理函数
** 输 入: 无
** 输 出: 无
********************************************************************/
.global Ep1_RxDone;
Ep1_RxDone:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
p0.l=lo(bEndp);
p0.h=hi(bEndp);
r0=0x2;
[p0]=r0;
call ReadLastTransactionStatus;
p0.l=lo(bLen);
p0.h=hi(bLen);
r0=D12_MAX_PACKET_SIZE;
[p0]=r0;
p0.l=lo(pBuf);
p0.h=hi(pBuf);
r0.l=lo(UsbCtrlBuf);
r0.h=hi(UsbCtrlBuf);
[p0]=r0;
call ReadEndpoint;
//add by wayman@2005-11-29
p0.l=lo(bEndp);
p0.h=hi(bEndp);
r0=0x2;
[p0]=r0;
call ClearBuf;
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
Ep1_RxDone.end:
/*******************************************************************
** 函数名称: Ep2_TxDone()
** 功能描述: 端点2 IN(发送)处理处理函数
** 输 入: 无
** 输 出: 无
********************************************************************/
.global Ep2_TxDone;
Ep2_TxDone:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
p0.l=lo(bEndp);
p0.h=hi(bEndp);
r0=0x5;
[p0]=r0;
call ReadLastTransactionStatus;
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
Ep2_TxDone.end:
/*******************************************************************
** 函数名称: Ep2_RxDone()
** 功能描述: 端点2 OUT(接收)处理处理函数
** 输 入: 无
** 输 出: 无
********************************************************************/
.global Ep2_RxDone;
Ep2_RxDone:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
p0.l=lo(bEndp);
p0.h=hi(bEndp);
r0=0x4;
[p0]=r0;
call ReadLastTransactionStatus;
p0.l=lo(bLen);
p0.h=hi(bLen);
r0=D12_MAX_PACKET_SIZE;
[p0]=r0;
p0.l=lo(pBuf);
p0.h=hi(pBuf);
r0.l=lo(UsbCtrlBuf);
r0.h=hi(UsbCtrlBuf);
[p0]=r0;
call ReadEndpoint;
//add by wayman@2005-11-29
p0.l=lo(bEndp);
p0.h=hi(bEndp);
r0=0x4;
[p0]=r0;
call ClearBuf;
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
Ep2_RxDone.end:
/************************************************************
** 函数名称: reconnect_USB()
** 功能描述: 重新连接USB总线
************************************************************/
.global ReConnectD12;
ReConnectD12:
[ --SP ] = RETS;
[ --SP ] = r0;
//disconnect D12 from the host
call DisconnectD12;
//delay for a while
r0.l=1000;
call MsDelay;
//connect D12 to the host
call ConnectD12;
r0 = [ SP++ ];
RETS = [ SP++ ];
rts;
ReConnectD12.END:
/************************************************************
** 函数名称: disconnect_USB()
** 功能描述: 断开USB总线
************************************************************/
DisconnectD12:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
////write command byte
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0.l=0xF3;
w[p0]=r0.l;
call CmdOutPortB;
////write data byte 1
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0.l=D12_NOLAZYCLOCK;
w[p0]=r0.l;
call DataOutPortB;
////write data byte 2
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0.l=D12_SETTOONE | D12_CLOCK_12M;
w[p0]=r0.l;
call DataOutPortB;
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
DisconnectD12.end:
/************************************************************
** 函数名称: connect_USB()
** 功能描述: 连接USB总线
************************************************************/
ConnectD12:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
//connect D12 to the host
////write command byte
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0.l=0xF3;
w[p0]=r0.l;
call CmdOutPortB;
////write data byte 1
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0.l=D12_NOLAZYCLOCK|D12_SOFTCONNECT;
w[p0]=r0.l;
call DataOutPortB;
////write data byte 2
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0.l=D12_SETTOONE | D12_CLOCK_12M;
w[p0]=r0.l;
call DataOutPortB;
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
ConnectD12.end:
/************************************************************
** 函数名称: Get_D12_FirmwareVer()
** 功能描述: 获取firmware的版本号
** 输 入: 无
** 输 出: 16bit整数,如0x0100表示D12固件软件版本号为1.00,存于D12Data
************************************************************/
.global Get_D12_FirmwareVer;
Get_D12_FirmwareVer:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
r0=D12_FIRMWARE_VER;
p0.l=lo(D12Data);
p0.h=hi(D12Data);
[p0]=r0;
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
Get_D12_FirmwareVer.end:
//the code below is for test purpose
abc:
call SendResume;
p0.l=lo(bAddress);
p0.h=hi(bAddress);
r0=0x1;
[p0]=r0;
p0.l=lo(bEnable);
p0.h=hi(bEnable);
r0=0x1;
[p0]=r0;
call SetAddressEnable;
call SetEndpointEnable;
//delay for a while
r0.l=1000;
call MsDelay;
call ReadIntReg;
p0.l=lo(bEndp);
p0.h=hi(bEndp);
r0=0x0;
[p0]=r0;
call ReadLastTransactionStatus;
call SelectEndpoint;
call ReadEndpointStatus;
p0.l=lo(bLen);
p0.h=hi(bLen);
r0=8;
[p0]=r0;
p0.l=lo(pBuf);
p0.h=hi(pBuf);
r0.l=lo(UsbCtrlBuf);
r0.h=hi(UsbCtrlBuf);
[p0]=r0;
call ReadEndpoint;
call WriteEndpoint;
call ReadIntReg;
abc.end:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -