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

📄 pdiusbd12biancheng.txt

📁 PDIUSBD12固件编程例子
💻 TXT
📖 第 1 页 / 共 5 页
字号:



/* 
//************************************************************************* 
// File Name: ISR.C 
// 98/11/25 Added I/O mode Main endpoints access. (WK) 
//************************************************************************* 
*/ 


#include <stdio.h> 
#include <string.h> 


#ifdef __C51__ 
#include <reg51.h> /* special function register declarations */ 
#else 
#include <dos.h> 
#endif 


#include "epphal.h" 
#include "d12ci.h" 
#include "mainloop.h" 
#include "usb100.h" 


extern void bus_reset(void); 

extern void ep0_txdone(void); 
extern void ep0_rxdone(void); 


extern void ep1_txdone(void); 
extern void ep1_rxdone(void); 


extern void main_txdone(void); 
extern void main_rxdone(void); 


extern void dma_eot(void); 
/* 
//************************************************************************* 
// Public static data 
//************************************************************************* 


11


广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com 

*/ 
EPPFLAGS bEPPflags; 


/* Control endpoint TX/RX buffers */ 
extern CONTROL_XFER ControlData; 


/* ISR static vars */ 
unsigned char idata GenEpBuf[EP1_PACKET_SIZE]; 
IO_REQUEST idata ioRequest; 


unsigned long ClockTicks = 0; 

#ifndef __C51__ 
void interrupt (*OldTimerIsr)(); 
void interrupt (*OldUsbIsr)(); 


unsigned long ClockIsr = 0; 
extern unsigned long dmaBuffer; 
extern unsigned long ioBuffer; // V2.1 
extern unsigned short ioSize, ioCount; // V2.1 
#endif 


#ifdef __C51__ 
timer_isr() interrupt 1 
{ 


 DISABLE; 
ClockTicks++; 
bEPPflags.bits.timer = 1; 
ENABLE; 


} 
#else 
void interrupt timer_isr(void) 
{ 


 DISABLE; 

 ClockTicks++; 
bEPPflags.bits.timer = 1; 


 (*OldTimerIsr)(); 

 ENABLE; 
} 
#endif 


#ifdef __C51__ 

12 


广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com 

usb_isr() interrupt 0 

{ 
DISABLE; 
fn_usb_isr(); 
ENABLE; 


} 
#else 
void interrupt usb_isr(void) 
{ 


ClockIsr = ClockTicks;

 D12Eval_outportb(0x0, 0x80); 

 fn_usb_isr(); 

 outportb(0x20, 0x20); 

 D12Eval_outportb(0x80, 0x80); 
} 
#endif 


void fn_usb_isr() 
{ 
unsigned int i_st; 


bEPPflags.bits.in_isr = 1; 

i_st = D12_ReadInterruptRegister(); 

if(i_st != 0) { 

if(i_st & D12_INT_BUSRESET) { 
bus_reset(); 
bEPPflags.bits.bus_reset = 1; 


} 
else { 
if(i_st & D12_INT_EOT) 
dma_eot();


 if(i_st & D12_INT_SUSPENDCHANGE) 
bEPPflags.bits.suspend = 1; 


 if(i_st & D12_INT_ENDP0IN) 
ep0_txdone(); 
if(i_st & D12_INT_ENDP0OUT) 


13 


广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com 

 ep0_rxdone(); 
if(i_st & D12_INT_ENDP1IN) 
ep1_txdone(); 
if(i_st & D12_INT_ENDP1OUT) 
ep1_rxdone(); 
if(i_st & D12_INT_ENDP2IN) 
main_txdone(); 
if(i_st & D12_INT_ENDP2OUT) 
main_rxdone(); 
} 
} 


bEPPflags.bits.in_isr = 0; 
} 

void bus_reset(void) 
{ 
} 

void ep0_rxdone(void) 
{ 
unsigned char ep_last, i; 

ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag 

if (ep_last & D12_SETUPPACKET) {

 ControlData.wLength = 0; 
ControlData.wCount = 0; 


if( D12_ReadEndpoint(0, (unsigned char *)(&(ControlData.DeviceRequest)), 
sizeof(ControlData.DeviceRequest)) != sizeof(DEVICE_REQUEST) ) { 

 D12_SetEndpointStatus(0, 1); 
D12_SetEndpointStatus(1, 1); 
bEPPflags.bits.control_state = USB_IDLE; 


 return; 
} 


#ifdef __C51__ 
ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue); 
ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex); 
ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength); 

14


广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com 

#endif 

// Acknowledge setup here to unlock in/out endp 
D12_AcknowledgeEndpoint(0); 
D12_AcknowledgeEndpoint(1);


 ControlData.wLength = ControlData.DeviceRequest.wLength; 
ControlData.wCount = 0; 

if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) 

{ 
bEPPflags.bits.setup_packet = 1; 
bEPPflags.bits.control_state = USB_IDLE; /* get command */


 } 
else { 


if (ControlData.DeviceRequest.wLength == 0) { 
bEPPflags.bits.setup_packet = 1; 
bEPPflags.bits.control_state = USB_IDLE; /* set command */

 } 
else {


 if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) { 
bEPPflags.bits.control_state = USB_IDLE; 
D12_SetEndpointStatus(0, 1); 
D12_SetEndpointStatus(1, 1); 

} 
else { 
bEPPflags.bits.control_state = USB_RECEIVE; /* set command with OUT 
token */ 
} 
} // set command with data 
} // else set command 
} // if setup packet 

else if (bEPPflags.bits.control_state == USB_RECEIVE) { 
i = D12_ReadEndpoint(0, ControlData.dataBuffer + ControlData.wCount, 
EP0_PACKET_SIZE); 

 ControlData.wCount += i; 

if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) { 
bEPPflags.bits.setup_packet = 1; 
bEPPflags.bits.control_state = USB_IDLE; 

} 
} 


15 


广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com 

 else { 
bEPPflags.bits.control_state = USB_IDLE; 
} 
} 

void ep0_txdone(void) 
{ 
short i = ControlData.wLength - ControlData.wCount; 

D12_ReadLastTransactionStatus(1); // Clear interrupt flag 

if (bEPPflags.bits.control_state != USB_TRANSMIT) 
return; 


if( i >= EP0_PACKET_SIZE) { 
D12_WriteEndpoint(1, ControlData.pData + ControlData.wCount, EP0_PACKET_SIZE); 
ControlData.wCount += EP0_PACKET_SIZE; 

 bEPPflags.bits.control_state = USB_TRANSMIT; 
} 
else if( i != 0) { 


D12_WriteEndpoint(1, ControlData.pData + ControlData.wCount, i); 
ControlData.wCount += i; 

 bEPPflags.bits.control_state = USB_IDLE; 
} 
else if (i == 0){ 


D12_WriteEndpoint(1, 0, 0); // Send zero packet at the end ??? 

 bEPPflags.bits.control_state = USB_IDLE; 
} 
} 

void dma_eot(void) 
{ 
if(bEPPflags.bits.dma_state == DMA_PENDING) 
bEPPflags.bits.setup_dma = 1; 
else 
bEPPflags.bits.dma_state = DMA_IDLE; 
} 

void ep1_txdone(void) 
{ 
D12_ReadLastTransactionStatus(3); /* Clear interrupt flag */ 

16


广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com 

} 

void ep1_rxdone(void) 
{ 
unsigned char len; 


D12_ReadLastTransactionStatus(2); /* Clear interrupt flag */ 

len = D12_ReadEndpoint(2, GenEpBuf, sizeof(GenEpBuf)); 

if(len != 0) 
bEPPflags.bits.ep1_rxdone = 1; 
} 


void main_txdone(void) 
{ 
#ifndef __C51__ 


unsigned short len; 
unsigned char far *fp; 
unsigned short seg, off; 


#endif 

D12_ReadLastTransactionStatus(5); /* Clear interrupt flag */ 

#ifndef __C51__ 
seg = (ioBuffer + ioCount)>>4; 
off = (ioBuffer + ioCount)&0xf; 
fp = MK_FP(seg, off); 


len = ioSize - ioCount; 
if(len == 0) { 
if(bEPPflags.bits.dma_state == DMA_PENDING) 
bEPPflags.bits.setup_dma = 1; 
else


 bEPPflags.bits.dma_state = DMA_IDLE; 
} 
else { 


 if(len > 64)

 len = 64; 
len = D12_WriteEndpoint(5, fp, len); 
ioCount += len; 


} 
#endif 
} 


17 


广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com 

void main_rxdone(void) 
{ 
#ifndef __C51__ 


unsigned char len; 
unsigned char far *fp; 
unsigned short seg, off; 


#endif 

D12_ReadLastTransactionStatus(4); /* Clear interrupt flag */ 

#ifndef __C51__ 
seg = (ioBuffer + ioCount)>>4; 
off = (ioBuffer + ioCount)&0xf; 
fp = MK_FP(seg, off); 


len = D12_ReadMainEndpoint( fp ); 
ioCount += len; 
if(ioCount >= ioSize) {


 if(bEPPflags.bits.dma_state == DMA_PENDING) 
bEPPflags.bits.setup_dma = 1; 
else 
bEPPflags.bits.dma_state = DMA_IDLE; 


} 
#endif 
} 


主循环 
MAINLOOP.C 

主循环检查事件标志并进入对应的子程序进行进一步的处理它还包含人机接口的代码例如 
LED
和键盘扫描 



/* 
//************************************************************************* 
// File Name: MainLoop.C 
// 98/11/25 Added I/O access support on Main endpoints. (WK) 
//************************************************************************* 
*/ 


#include <stdio.h> 
#include <string.h> 
#ifdef __C51__ 
#include <reg51.h> /* special function register declarations */ 
#else 
#include <bios.h> 
#include <dos.h> 
#include <malloc.h> 
#endif 


18 


广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com 

#include "epphal.h" 
#include "d12ci.h" 
#include "mainloop.h" 
#include "usb100.h" 
#include "chap_9.h" 
#include "protodma.h" 
/* 
//************************************************************************* 
// USB protocol function pointer arrays 
//************************************************************************* 
*/ 
code void (*StandardDeviceRequest[])(void) = 
{ 


 get_status, 
clear_feature, 
reserved, 
set_feature, 
reserved, 
set_address, 
get_descriptor, 
reserved, 
get_configuration, 
set_configuration, 
get_interface, 
set_interface, 
reserved, 
reserved, 
reserved, 
reserved 


}; 

code void (*VendorDeviceRequest[])(void) = 

{ 
reserved, 
reserved, 
reserved, 
reserved, 
reserved, 
reserved, 
reserved, 
reserved, 
reserved, 
reserved, 


19 


广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com 

 reserved, 
reserved, 
read_write_register, 
reserved, 
reserved, 
reserved 


}; 


/* 
//************************************************************************* 
// Public static data 
//************************************************************************* 
*/ 


extern EPPFLAGS bEPPflags; 
extern unsigned long ClockTicks; 
extern unsigned char idata GenEpBuf[]; 
extern IO_REQUEST idata ioRequest; 


CONTROL_XFER ControlData; 


code char * _NAME_USB_REQUEST_DIRECTION[] = 
{ 
"Host_to_device", 
"Device_to_host" 
}; 


code char * _NAME_USB_REQUEST_RECIPIENT[] = 
{ 
"Device", 
"Interface", 
"Endpoint(0)", 
"Other" 
}; 


code char * _NAME_USB_REQUEST_TYPE[] = 
{ 
"Standard", 
"Class", 
"Vendor", 
"Reserved" 
}; 


code char * _NAME_USB_STANDARD_REQUEST[] = 


20


广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com 

{ 
"GET_STATUS", 
"CLEAR_FEATURE", 
"RESERVED", 
"SET_FEATURE", 
"RESERVED", 
"SET_ADDRESS", 
"GET_DESCRIPTOR", 
"SET_DESCRIPTOR", 
"GET_CONFIGURATION", 
"SET_CONFIGURATION", 
"GET_INTERFACE", 
"SET_INTERFACE", 
"SYNC_FRAME" 
}; 


void help_devreq(unsigned char typ, unsigned char req) 
{ 
typ >>= 5; 


if(typ == USB_STANDARD_REQUEST) { 
printf("Request Type = %s, Request = %s.\n", _NAME_USB_REQUEST_TYPE[typ], 

 _NAME_USB_STANDARD_REQUEST[req]); 
} 
else { 


#ifdef __C51__ 
if(bEPPflags.bits.verbose) 
printf("Request Type = %s, bRequest = 0x%bx.\n", _NAME_USB_REQUEST_TYPE[typ], 
req); 

#else 
if(bEPPflags.bits.verbose) 
printf("Request Type = %s, bRequest = 0x%x.\n", _NAME_USB_REQUEST_TYPE[typ], 
req); 
#endif 
} 
} 

/* Configure Timer 0 
-Mode = 1 
-Interrupt = ENABLED 
-Clock Source = INTERNAL


 - Enable Gating Control = DISABLED 
*/ 
21 


广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com 

⌨️ 快捷键说明

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