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