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

📄 pdiusbd12biancheng.txt

📁 PDIUSBD12固件编程例子
💻 TXT
📖 第 1 页 / 共 5 页
字号:
ioBuffer = dmaBuffer + offset; 
ioSize = ioRequest.uSize; 
ioCount = 0; 


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


32 

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

 DISABLE; 
bEPPflags.bits.dma_state = DMA_RUNNING; 
ENABLE; 


 single_transmit(0, 0); 

if(ioRequest.bCommand & 0x1) { 

if(ioSize > 64) { 
D12_WriteEndpoint(5, fp, 64); 
ioCount += 64; 


}

 else { 
D12_WriteEndpoint(5, fp, ioSize); 
ioCount += ioSize;


 }

 } 
} 
#endif 

void control_handler() 
{ 
unsigned char type, req; 

type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK; 
req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK; 

help_devreq(type, req); // print out device request 

if (type == USB_STANDARD_REQUEST) 
(*StandardDeviceRequest[req])(); 
else if (type == USB_VENDOR_REQUEST) 
(*VendorDeviceRequest[req])(); 
else 
stall_ep0(); 
} 

协议层 
CHAP_9.C PROTODMA.C 

协议层处理标准的 
USB器件请求还有特殊的厂商请求例如 
DMA和 
TWAIN 


/* 
//************************************************************************* 
// File Name: CHAP_9.C 
//************************************************************************* 

*/ 

33

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

#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" 
#include "chap_9.h" 


#define NUM_ENDPOINTS 4 

#define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR) \

 + sizeof(USB_INTERFACE_DESCRIPTOR) \ 
+ (NUM_ENDPOINTS * 
sizeof(USB_ENDPOINT_DESCRIPTOR)) 
extern CONTROL_XFER ControlData; 
extern IO_REQUEST idata ioRequest; 
extern EPPFLAGS bEPPflags; 
code USB_DEVICE_DESCRIPTOR DeviceDescr = 
{ 


 sizeof(USB_DEVICE_DESCRIPTOR), 
USB_DEVICE_DESCRIPTOR_TYPE, 
SWAP(0x0100), 
USB_CLASS_CODE_TEST_CLASS_DEVICE, 
0, 0,


 EP0_PACKET_SIZE, 
SWAP(0x0471), 
#ifndef __C51__ 
SWAP(0x0222), 
#else 
SWAP(0x0888), 
#endif


 SWAP(0x0100), 
0, 0, 0, 
1 


}; 

34 

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

code USB_CONFIGURATION_DESCRIPTOR ConfigDescr = 

{ 
sizeof(USB_CONFIGURATION_DESCRIPTOR), 
USB_CONFIGURATION_DESCRIPTOR_TYPE, 
SWAP(CONFIG_DESCRIPTOR_LENGTH),


 1, 
1, 


 0, 
0x60, 
0x1 


}; 

code USB_INTERFACE_DESCRIPTOR InterfaceDescr = 

{ 
sizeof(USB_INTERFACE_DESCRIPTOR), 
USB_INTERFACE_DESCRIPTOR_TYPE, 
0, 
0,


 NUM_ENDPOINTS, 
USB_CLASS_CODE_TEST_CLASS_DEVICE, 
USB_SUBCLASS_CODE_TEST_CLASS_D12, 
USB_PROTOCOL_CODE_TEST_CLASS_D12, 
0 


}; 

code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr = 

{ 
sizeof(USB_ENDPOINT_DESCRIPTOR), 
USB_ENDPOINT_DESCRIPTOR_TYPE, 
0x81, 
USB_ENDPOINT_TYPE_INTERRUPT, 
SWAP(EP1_PACKET_SIZE), 
10 


}; 
code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr = 
{ 


 sizeof(USB_ENDPOINT_DESCRIPTOR), 
USB_ENDPOINT_DESCRIPTOR_TYPE, 
0x1, 
USB_ENDPOINT_TYPE_INTERRUPT, 
SWAP(EP1_PACKET_SIZE), 
10 


}; 

35 

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

code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr = 

{ 
sizeof(USB_ENDPOINT_DESCRIPTOR), 
USB_ENDPOINT_DESCRIPTOR_TYPE, 
0x82, 
USB_ENDPOINT_TYPE_BULK, 
SWAP(EP2_PACKET_SIZE), 
10 


}; 

code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr = 

{ 
sizeof(USB_ENDPOINT_DESCRIPTOR), 
USB_ENDPOINT_DESCRIPTOR_TYPE, 
0x2, 
USB_ENDPOINT_TYPE_BULK, 
SWAP(EP2_PACKET_SIZE), 
10 


}; 

#ifndef __C51__ 
extern unsigned char far *dmaBuffer; 
#endif 
/*


 //************************************************************************* 
// USB Protocol Layer 
//************************************************************************* 

*/ 
void reserved(void) 
{ 


 stall_ep0(); 
} 
/*


 //************************************************************************* 
// USB standard device requests 
//************************************************************************* 

*/ 
void get_status(void) 
{ 


unsigned char endp, txdat[2]; 
unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT; 
unsigned char c; 


if (bRecipient == USB_RECIPIENT_DEVICE) { 


36 

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

 if(bEPPflags.bits.remote_wakeup == 1) 
txdat[0] = 3; 
else


 txdat[0] = 1; 
txdat[1]=0; 
single_transmit(txdat, 2); 


} else if (bRecipient == USB_RECIPIENT_INTERFACE) { 
txdat[0]=0; 
txdat[1]=0; 
single_transmit(txdat, 2); 


} else if (bRecipient == USB_RECIPIENT_ENDPOINT) { 
endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS); 
if (ControlData.DeviceRequest.wIndex & (unsigned 

char)USB_ENDPOINT_DIRECTION_MASK) 
c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */ 
else 
c = D12_SelectEndpoint(endp*2); /* Control-out */ 
if(c & D12_STALL) 
txdat[0] = 1; 
else

 txdat[0] = 0; 
txdat[1] = 0; 
single_transmit(txdat, 2); 


 } else 

 stall_ep0(); 
} 
void clear_feature(void) 
{ 


unsigned char endp; 
unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT; 


if (bRecipient == USB_RECIPIENT_DEVICE 
&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) { 
DISABLE; 
bEPPflags.bits.remote_wakeup = 0; 
ENABLE; 
single_transmit(0, 0); 

} 

else if (bRecipient == USB_RECIPIENT_ENDPOINT 
&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) { 
endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS); 

if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) 
/* clear TX stall for IN on EPn. */ 
D12_SetEndpointStatus(endp*2 + 1, 0); 

37

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

 else 
/* clear RX stall for OUT on EPn. */ 
D12_SetEndpointStatus(endp*2, 0); 


 single_transmit(0, 0); 
} else 


 stall_ep0(); 
} 
void set_feature(void) 
{ 

unsigned char endp; 
unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT; 


if (bRecipient == USB_RECIPIENT_DEVICE 
&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) { 
DISABLE; 
bEPPflags.bits.remote_wakeup = 1; 
ENABLE; 
single_transmit(0, 0); 

} 

else if (bRecipient == USB_RECIPIENT_ENDPOINT 
&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) { 
endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS); 

if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) 
/* clear TX stall for IN on EPn. */ 
D12_SetEndpointStatus(endp*2 + 1, 1); 

 else 
/* clear RX stall for OUT on EPn. */ 
D12_SetEndpointStatus(endp*2, 1); 


 single_transmit(0, 0); 
} else 
stall_ep0(); 
} 

void set_address(void) 
{ 
D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue & 
DEVICE_ADDRESS_MASK), 1); 
single_transmit(0, 0); 
} 

void get_descriptor(void) 
{ 
unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue); 

38

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

if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) { 
code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR)); 
} else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) { 


code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH); 
} else 
stall_ep0(); 
} 

void get_configuration(void) 
{ 
unsigned char c = bEPPflags.bits.configuration; 

 single_transmit(&c, 1); 
} 

void set_configuration(void) 
{ 

if (ControlData.DeviceRequest.wValue == 0) { 
/* put device in unconfigured state */ 
single_transmit(0, 0); 
DISABLE; 
bEPPflags.bits.configuration = 0; 
ENABLE; 
init_unconfig(); 


} else if (ControlData.DeviceRequest.wValue == 1) { 
/* Configure device */ 
single_transmit(0, 0); 


 init_unconfig(); 
init_config(); 


 DISABLE; 
bEPPflags.bits.configuration = 1; 
ENABLE;


 } else 
stall_ep0(); 
} 

void get_interface(void) 

{ 
unsigned char txdat = 0; /* Only/Current interface = 0 */ 
single_transmit(&txdat, 1); 

} 

39 

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

void set_interface(void) 
{ 
if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0) 
single_transmit(0, 0); 
else 

 stall_ep0(); 
} 
/*


 // File Name: PROTODMA.C 
// Author: Wenkai Du 
// Created: 18 Aug 98 
// Modified: 
// Revision: 2.0 
// 
//************************************************************************* 

*/ 

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


#ifdef __C51__ 
#include <reg51.h> /* special function register declarations */ 
#include "epphal.h" 


#else 
#include <dos.h> 
#endif 


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


extern CONTROL_XFER ControlData; 
extern IO_REQUEST idata ioRequest; 
extern EPPFLAGS bEPPflags; 


void get_firmware_version() 
{ 
unsigned char i; 


#ifndef __C51__ 
i = 0x01; // firmware version number, return 0x01 for PC kit version 1 
#else 
i = 0x21; // firmware version number, return 0x11 for PC kit using 8052, 0x21 for USB-EPP 

40 

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

#endif 
single_transmit((unsigned char *)&i, 1); 
} 


void setup_dma_request() 
{ 


memcpy((unsigned char *)&ioRequest + ControlData.DeviceRequest.wValue, 
ControlData.dataBuffer, 
ControlData.DeviceRequest.wLength); 


ioRequest.uSize = SWAP(ioRequest.uSize); 
ioRequest.uAddressL = SWAP(ioRequest.uAddressL); 


if(ioRequest.uSize > DMA_BUFFER_SIZE) { // Unaccepted request

 stall_ep0(); 
} 
else { 


if(bEPPflags.bits.dma_state == DMA_IDLE) { 
DISABLE; 
bEPPflags.bits.setup_dma = 1; 
ENABLE;


 }

 else { 
DISABLE; 
bEPPflags.bits.dma_state = DMA_PENDING; 
ENABLE;


 } 
} // else if accepted request 
} 


void read_write_register(void) 

{ 
unsigned char i; 
if(ControlData.DeviceRequest.bmRequestType & (unsigned char) 


USB_ENDPOINT_DIRECTION_MASK) { 

 if(bEPPflags.bits.verbose) 

printf("Read Registers: Offset = 0x%x, Length = 0x%x, Index = 0x%x.\n", 
ControlData.DeviceRequest.wValue, 
ControlData.DeviceRequest.wLength, 
ControlData.DeviceRequest.wIndex); 

if(ControlData.DeviceRequest.wIndex == GET_FIRMWARE_VERSION && 
ControlData.DeviceRequest.wValue == 0 && 

41 

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

 ControlData.DeviceRequest.wLength == 1) 
get_firmware_version(); 
else 
stall_ep0(); 


} // if read register 
else{ 
if(bEPPflags.bits.verbose) { 


printf("Write Registers: Offset = 0x%x, Length = 0x%x, Index = 0x%x.\n", 
ControlData.DeviceRequest.wValue, 
ControlData.DeviceRequest.wLength, 
ControlData.DeviceRequest.wIndex); 

 printf("Data: "); 
for(i = 0; i < ControlData.DeviceRequest.wLength; i ++) 
#ifndef __C51__ 
printf("0x%x, ", *((ControlData.dataBuffer)+i)); 
#else 
printf("0x%bx, ", *((ControlData.dataBuffer)+i)); 
#endif 
printf("\n"); 
} 


if(ControlData.DeviceRequest.wIndex == SETUP_DMA_REQUEST && 
ControlData.DeviceRequest.wValue == 0 && 
ControlData.DeviceRequest.wLength == 6) 
setup_dma_request();

 else 
stall_ep0(); 
} // if write register 
} 


与其它 
CPU平台的固件接口

下表所示为积木结构中需要修改的部分有两个级别的接口第一是第 
9章协议它通过支持标准 
USB请求使固件通过枚举第二级是完全的产品开发这将包括产品特殊的固件代码


文件名 
Chapter 9 Only 产品级别 
EPPHAL.C口到硬件口到硬件 
D12CI.C无变化无变化 
CHAP_9.C 无变化产品专门的 
USB描述符 
PROTODMA.C 无变化如果需要增加厂商请求 
ISR.C 无变化在普通和主端点上增加产品专门的
处理 
MAINLOOP.C由 
CPU和系统决定口定时器
和中断初始化需要重写
增加产品专门的主循环处理

42

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

⌨️ 快捷键说明

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