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