📄 sl811.lst
字号:
C51 COMPILER V7.06 SL811 08/10/2005 23:36:34 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE SL811
OBJECT MODULE PLACED IN SL811.OBJ
COMPILER INVOKED BY: D:\Keil51\C51\BIN\C51.EXE SL811.C BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include "common.h"
2 #include "SL811.H"
3 #include "HAL.H"
4
5 extern FLAGS bdata bFlags;
6 PKG usbstack;
7 unsigned char xdata DBUF[BUFFER_LENGTH];
8 pUSBDEV xdata uDev; // Multiple USB devices attributes, Max 5 devices
9
10 //*****************************************************************************************
11 // SL811H variables initialization
12 //*****************************************************************************************
13 void USBReset(void)
14 {
15 1 unsigned char temp;
16 1 temp=SL811Read(CtrlReg);
17 1 SL811Write(CtrlReg,temp|0x08);
18 1 DelayMs(25);
19 1 SL811Write(CtrlReg,temp);
20 1 }
21
22 //*****************************************************************************************
23 // usbXfer:
24 // successful transfer = return TRUE
25 // fail transfer = return FALSE
26 //*****************************************************************************************
27 unsigned char usbXfer(void)
28 {
29 1
30 1 unsigned char xferLen, data0, data1,cmd;
31 1 unsigned char intr,result,remainder,dataX,bufLen,addr,timeout;
32 1 unsigned char out[8];
33 1 //------------------------------------------------
34 1 // Default setting for usb trasnfer
35 1 //------------------------------------------------
36 1 dataX=timeout=0;
37 1
38 1 data0 = EP0_Buf; // DATA0 buffer address
39 1 data1 = data0 + (unsigned char)usbstack.wPayload; // DATA1 buffer address
40 1 bFlags.bits.DATA_STOP=FALSE;
41 1 bFlags.bits.TIMEOUT_ERR=FALSE;
42 1 //------------------------------------------------
43 1 // Define data transfer payload
44 1 //------------------------------------------------
45 1 if (usbstack.wLen >= usbstack.wPayload) // select proper data payload
46 1 xferLen = usbstack.wPayload; // limit to wPayload size
47 1 else // else take < payload len
48 1 xferLen = usbstack.wLen; //
49 1
50 1 // For IN token
51 1 if (usbstack.pid==PID_IN) // for current IN tokens
52 1 { //
53 2 cmd = sDATA0_RD; // FS/FS on Hub, sync to sof
54 2 }
55 1 // For OUT token
C51 COMPILER V7.06 SL811 08/10/2005 23:36:34 PAGE 2
56 1 else if(usbstack.pid==PID_OUT) // for OUT tokens
57 1 {
58 2 if(xferLen) // only when there are
59 2 {
60 3 SL811BufWrite(data0,usbstack.buffer,xferLen); // data to transfer on USB
61 3 }
62 2 cmd = sDATA0_WR; // FS/FS on Hub, sync to sof
63 2 // implement data toggle
64 2 bFlags.bits.bData1 = uDev.bData1[usbstack.endpoint];
65 2 uDev.bData1[usbstack.endpoint] = (uDev.bData1[usbstack.endpoint] ? 0 : 1); // DataToggle
66 2
67 2 if(bFlags.bits.bData1)
68 2 cmd |= 0x40; // Set Data1 bit in command
69 2 }
70 1 //------------------------------------------------
71 1 // For SETUP/OUT token
72 1 //------------------------------------------------
73 1 else // for current SETUP/OUT tokens
74 1 {
75 2 if(xferLen) // only when there are
76 2 { // data to transfer on USB
77 3 intr=usbstack.setup.wLength;
78 3 out[0]=usbstack.setup.bmRequest;
79 3 out[1]=usbstack.setup.bRequest;
80 3 out[2]=(unsigned char)usbstack.setup.wValue;
81 3 out[3]=(unsigned char)(usbstack.setup.wValue>>8);
82 3 out[4]=(unsigned char)usbstack.setup.wIndex;
83 3 out[5]=(unsigned char)(usbstack.setup.wIndex>>8);
84 3 out[6]=(unsigned char)usbstack.setup.wLength;
85 3 out[7]=(unsigned char)(usbstack.setup.wLength>>8);
86 3 SL811BufWrite(data0,out,xferLen);
87 3 usbstack.setup.wLength=intr;
88 3 }
89 2 cmd = sDATA0_WR; // FS/FS on Hub, sync to sof
90 2 }
91 1 //------------------------------------------------
92 1 // For EP0's IN/OUT token data, start with DATA1
93 1 // Control Endpoint0's status stage.
94 1 // For data endpoint, IN/OUT data, start ????
95 1 //------------------------------------------------
96 1 if (usbstack.endpoint == 0 && usbstack.pid != PID_SETUP) // for Ep0's IN/OUT token
97 1 cmd |= 0x40; // always set DATA1
98 1 //------------------------------------------------
99 1 // Arming of USB data transfer for the first pkt
100 1 //------------------------------------------------
101 1 SL811Write(EP0Status,((usbstack.endpoint&0x0F)|usbstack.pid)); // PID + EP address
102 1 SL811Write(EP0Counter,usbstack.usbaddr); // USB address
103 1 SL811Write(EP0Address,data0); // buffer address, start with "data0"
104 1 SL811Write(EP0XferLen,xferLen); // data transfer length
105 1 SL811Write(IntStatus,INT_CLEAR); // clear interrupt status
106 1 SL811Write(EP0Control,cmd); // Enable ARM and USB transfer start here
107 1
108 1 //------------------------------------------------
109 1 // Main loop for completing a wLen data trasnfer
110 1 //------------------------------------------------
111 1 while(TRUE)
112 1 {
113 2 //---------------Wait for done interrupt------------------
114 2 while(TRUE) // always ensure requested device is
115 2 { // inserted at all time, then you will
116 3 intr = SL811Read(IntStatus);
117 3 // wait for interrupt to be done, and
C51 COMPILER V7.06 SL811 08/10/2005 23:36:34 PAGE 3
118 3 if((intr & USB_RESET) || (intr & INSERT_REMOVE)) // proceed to parse result from slave
119 3 { // device.
120 4 bFlags.bits.DATA_STOP = TRUE; // if device is removed, set DATA_STOP
121 4 return FALSE; // flag true, so that main loop will
122 4 } // know this condition and exit gracefully
123 3 if(intr & USB_A_DONE)
124 3 break; // interrupt done !!!
125 3 }
126 2
127 2 SL811Write(IntStatus,INT_CLEAR); // clear interrupt status
128 2 result = SL811Read(EP0Status); // read EP0status register
129 2 remainder = SL811Read(EP0Counter); // remainder value in last pkt xfer
130 2
131 2 //-------------------------ACK----------------------------
132 2 if (result & EP0_ACK) // Transmission ACK
133 2 {
134 3
135 3 // SETUP TOKEN
136 3 if(usbstack.pid == PID_SETUP) // do nothing for SETUP/OUT token
137 3 break; // exit while(1) immediately
138 3
139 3 // OUT TOKEN
140 3 else if(usbstack.pid == PID_OUT)
141 3 break;
142 3
143 3 // IN TOKEN
144 3 else if(usbstack.pid == PID_IN)
145 3 { // for IN token only
146 4 usbstack.wLen -= (WORD)xferLen; // update remainding wLen value
147 4 cmd ^= 0x40; // toggle DATA0/DATA1
148 4 dataX++; // point to next dataX
149 4
150 4 //------------------------------------------------
151 4 // If host requested for more data than the slave
152 4 // have, and if the slave's data len is a multiple
153 4 // of its endpoint payload size/last xferLen. Do
154 4 // not overwrite data in previous buffer.
155 4 //------------------------------------------------
156 4 if(remainder==xferLen) // empty data detected
157 4 bufLen = 0; // do not overwriten previous data
158 4 else // reset bufLen to zero
159 4 bufLen = xferLen; // update previous buffer length
160 4
161 4 //------------------------------------------------
162 4 // Arm for next data transfer when requested data
163 4 // length have not reach zero, i.e. wLen!=0, and
164 4 // last xferlen of data was completed, i.e.
165 4 // remainder is equal to zero, not a short pkt
166 4 //------------------------------------------------
167 4 if(!remainder && usbstack.wLen) // remainder==0 when last xferLen
168 4 { // was all completed or wLen!=0
169 5 addr = (dataX & 1) ? data1:data0; // select next address for data
170 5 xferLen = (BYTE)(usbstack.wLen>=usbstack.wPayload) ? usbstack.wPayload:usbstack.wLen; // get data len
-gth required
171 5
172 5 cmd |= 0x20; // always sync SOF when FS, regardless
173 5 SL811Write(EP0XferLen, xferLen); // select next xfer length
174 5 SL811Write(EP0Address, addr); // data buffer addr
175 5 SL811Write(IntStatus,INT_CLEAR); // is a LS is on Hub.
176 5 SL811Write(EP0Control,cmd); // Enable USB transfer and re-arm
177 5 }
178 4
C51 COMPILER V7.06 SL811 08/10/2005 23:36:34 PAGE 4
179 4 //------------------------------------------------
180 4 // Copy last IN token data pkt from prev transfer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -