📄 host_811.lst
字号:
C51 COMPILER V8.08 HOST_811 04/25/2009 23:03:20 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE HOST_811
OBJECT MODULE PLACED IN HOST_811.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE HOST_811.C LARGE OMF2 BROWSE DEBUG
line level source
1 //////////////////////////////////////////////////////////////////////////////
2 //author:dragon;www.8dragon.com
3 //2004年完成于桃龙源
4 //
5 //////////////////////////////////////////////////////////////////////////
6 #include <stdio.h>
7 #include <c8051F020.h>
8 #include "host_811.h"
9 #include "MAIN.H"
10 xdata BYTE SL811H_ADDR _at_ 0x4000; //A0=0
11 xdata BYTE SL811H_DATA _at_ 0x4001; //A0=1
12 //////////////////////////////////////////////////////////////////////////
13 BYTE xdata bBUF[256]; // at 0x2000 for general descriptors data
14 USBDEV idata uDev; // Multiple USB devices attributes, Max 5 devices
15 //////////////////////////////////////////////////////////////////////////
16 Control bdata USB_Control; //全局命令控制变量
17 BYTE bData1; //乒乓操作标志
18 BYTE d1,d2;
19 //*****************************************************************************************
20 // Byte Read from SL811H
21 // a = register address
22 // return = data in register
23 //*****************************************************************************************
24 BYTE SL811Read(BYTE idata a)
25 {
26 1 SL811H_ADDR = a;
27 1 return (SL811H_DATA);
28 1 }
29 //*****************************************************************************************
30 // Byte Write to SL811H
31 // a = register address
32 // d = data to be written to this register address
33 //*****************************************************************************************
34 void SL811Write(BYTE idata a, BYTE idata d)
35 {
36 1 SL811H_ADDR = a;
37 1 SL811H_DATA = d;
38 1 }
39 //*****************************************************************************************
40 // Buffer Read from SL811H
41 // addr = buffer start address
42 // s = return buffer address where data are to be save/read
43 // c = buffer data length
44 //*****************************************************************************************
45 void SL811BufRead(BYTE addr, BYTE *s, BYTE c)
46 {
47 1 BYTE idata i;
48 1 ////////////////////////////////////////////////////////////////////////
49 1 i=c;
50 1 SL811H_ADDR = addr;
51 1 while (i--)
52 1 *s++ = SL811H_DATA;
53 1 }
54
55 //*****************************************************************************************
C51 COMPILER V8.08 HOST_811 04/25/2009 23:03:20 PAGE 2
56 // Buffer Write to SL811H
57 // addr = buffer start address
58 // s = buffer address where data are to be written
59 // c = buffer data length
60 //*****************************************************************************************
61 void SL811BufWrite(BYTE addr, BYTE *s, BYTE c)
62 {
63 1 SL811H_ADDR = addr;
64 1 while (c--)
65 1 SL811H_DATA = *s++;
66 1 }
67 void DelayMs(BYTE nFactor)
68 {
69 1 BYTE i;
70 1 BYTE j;
71 1
72 1 for(i=0; i<nFactor; i++)
73 1 {
74 2 Clr_WDT();
75 2 for(j=0;j<240;j++)
76 2 j=j;
77 2 }
78 1 }
79
80 WORD WordSwap(WORD input)
81 {
82 1 return(((input&0x00FF)<<8)|((input&0xFF00)>>8));
83 1 }
84 DWORD DWordSwap(DWORD dData)
85 {
86 1 dData = (dData&0xff)<<24|(dData&0xff00)<<8|(dData&0xff000000)>>24|(dData&0xff0000)>>8;
87 1 return dData;
88 1 }
89
90 void USBReset()
91 {
92 1 BYTE temp;
93 1 BYTE i;
94 1 ////////////////////////////////////////////////////////////////////////
95 1 /* SL811Write(cSOFcnt,0xae);
96 1 SL811Write(CtrlReg,0x48);
97 1 DelayMs(10);
98 1 SL811Write(CtrlReg,0x00);
99 1 DelayMs(10);*/
100 1 i=SL811Read(IntStatus);
101 1 if(i&0x80)
102 1 {
103 2 SL811Write(cDATASet,0xe0);
104 2 SL811Write(cSOFcnt,0xae);
105 2 SL811Write(CtrlReg,0x05);
106 2 //SL811Write(0x00, 0x01); //Arm Transfers
107 2 }
108 1 SL811Write(EP0Status,0x50);
109 1 SL811Write(EP0Counter,0x00);
110 1 SL811Write(EP0Control,0x01);
111 1 DelayMs(150);
112 1 temp=SL811Read(CtrlReg);
113 1 SL811Write(CtrlReg,temp|0x08);
114 1 DelayMs(15);
115 1 SL811Write(CtrlReg,temp | 0x18);
116 1 DelayMs(15);//Delay(200);
117 1 SL811Write(CtrlReg,temp | 0x08);
C51 COMPILER V8.08 HOST_811 04/25/2009 23:03:20 PAGE 3
118 1 DelayMs(15);//Delay(200);
119 1 SL811Write(CtrlReg,temp);
120 1 DelayMs(150);
121 1 //DelayMs(400);//Delay(2000);
122 1 }
123
124
125
126 //*****************************************************************************************
127 // usbXfer:
128 // successful transfer = return TRUE
129 // fail transfer = return FALSE
130 //*****************************************************************************************
131 unsigned char usbXfer(BYTE usbaddr, BYTE endpoint, BYTE pid,WORD wPayload, WORD wLen, BYTE *buffer)
132 {
-
133 1 BYTE cmd, result, timeout, intr;
134 1 BYTE xferLen, bufLen, data0, data1, dataX, addr,remainder;
135 1 ////////////////////////////////////////////////////////////////////////
136 1 //------------------------------------------------
137 1 // Default setting for usb trasnfer
138 1 //------------------------------------------------
139 1 //result = SL811Read(EP0Status);
140 1 //printf("result=%x\n\r",result);
141 1 bufLen = dataX = timeout = 0; //reset all
142 1 data0 = EP0_Buf; // DATA0 buffer address
143 1 data1 = data0 + (BYTE)wPayload; // DATA1 buffer address
144 1 USB_Control.DATA_STOP = USB_Control.TIMEOUT_ERR = FALSE; // set default conditions
145 1 //------------------------------------------------
146 1 // Define data transfer payload
147 1 //------------------------------------------------
148 1 if (wLen >= wPayload) // select proper data payload
149 1 xferLen = wPayload; // limit to wPayload size
150 1 else // else take < payload len
151 1 xferLen = wLen; //一次传输的数据长度;
152 1
153 1 //------------------------------------------------
154 1 // For IN token
155 1 //------------------------------------------------
156 1 if (pid==PID_IN) // for current IN tokens
157 1 {
158 2 cmd=sDATA0_RD;
159 2 }
160 1 //------------------------------------------------
161 1 // For OUT token
162 1 //------------------------------------------------
163 1 else if(pid==PID_OUT) // for OUT tokens
164 1 {
165 2 if(xferLen) // only when there are
166 2 SL811BufWrite(data0,buffer,xferLen); // data to transfer on USB
167 2 cmd=sDATA0_WR;
168 2 bData1 = uDev.bData1[endpoint];
169 2 uDev.bData1[endpoint] = (uDev.bData1[endpoint] ? 0 : 1); // DataToggle
170 2 if(bData1)
171 2 cmd |= 0x40; // Set Data1 bit in command
172 2 }
173 1 //------------------------------------------------
174 1 // For SETUP/OUT token
175 1 //------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -