OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [Documentation/] [arm/] [SA1100/] [SA1100_USB] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
StrongARM SA-1100 USB function Driver
2
Ward Willats  -  08Mar01
3
 
4
1. History
5
''''''''''
6
Brad Parker  ported the DEC/Compaq "Itsy"
7
SA-1100 USB Function driver to the 2.4.x code base in late 2000, for
8
use as an "ethernet over usb" link. His original notes are here in
9
section 4. Nicolas Pitre  rewrote the transmitter and
10
reciver (endpoints 1 and 2) in late 2000 to use the standard SA DMA
11
API and I added a bulk character interface and reworked the control
12
control module code and rewrote endpoint zero in early 2001.
13
 
14
This release (22Feb01) is the first that completely separates
15
client modules (usb-eth.c and usb-char.c) from the SA-1100 USB core.
16
(usb_ctl, usb_ep0, usb_send and usb_receive)and makes the whole
17
mess a module. Oleg Drokin has done a huge amount of work, fixing
18
things I break and adding support for the generic usbnet driver
19
from the AC tree.
20
 
21
2. Usage
22
''''''''
23
Turn on CONFIG_SA1100_USB_NETLINK to use the "ethernet over usb"
24
functionality. Turn it off to use the character oriented
25
interface. The character driver currently uses mknod c 10 240.
26
 
27
Programming:
28
The public interface is in sa1100_usb.h. For a client USB service
29
to use the SA-1100 USB core driver it should:
30
 
31
1. Call sa1100_usb_open() to get the usb core assigned to it.
32
 
33
2. Setup descriptors as appropriate for the task at hand. Esp.
34
important are endpoint max packet lengths, vendor and product IDs,
35
and type of endpoint (bulk or interrupt). Call
36
sa1100_get_descriptor_ptr() to get this.
37
 
38
3. Call sa1100_usb_start() to actually start the usb hardware.
39
At this time the host will configure the device.
40
 
41
...at shutdown...
42
 
43
4. Call sa1100_usb_stop() to stop the USB core.
44
5. Call sa1100_usb_close() to free the core for use by another
45
client.
46
 
47
3. Netlink Usage
48
''''''''''''''''
49
StrongARM SA-1100 USB function "ethernet over usb driver"
50
Brad Parker 
51
 
52
I ported the DEC "Itsy" usb "ethernet over usb driver" code to the 2.4.x
53
base and made some enhacements and bug fixes.  This code has 2 sides and
54
implements a simple "ethernet over usb" functionality.
55
 
56
function (SA1100) side:
57
- the driver has two endpoints and uses interrupt and bulk transfer to
58
receive/send packets.  the driver does not require any other usb code
59
and should work on most any sa1100.
60
 
61
host (SA1111) side:
62
- because the SA1111 usb host is not working yet I tested this driver
63
(usb-net-host.c) on a 2.2.14 based PC with the latest usb backport.
64
It has been fully converted to use URBs and worked well with my UHCI
65
based controller.
66
 
67
TESTING:
68
 
69
To test you need an assabet on the 'function' side, a PC on the 'host'
70
side and a USB A-B cable to connect them together.
71
 
72
Boot a kernel on the assabet with "USB function and net-host support"
73
(CONFIG_SA1100_USB) turned on.  This will define an interface named
74
"usbf".  Once it's booted you can setup the interface with
75
 
76
        mount -t proc /proc /proc
77
        /sbin/ifconfig usbf 1.1.1.2
78
 
79
I used a 2.2.14 kernel on a x86 PC for the host side.  It has a built
80
in UHCI usb controller chip.  I installed the latest USB backport from
81
http://www.linux-usb.org onto the 2.2.14 kernel sources and turned on
82
"USB net-host" (CONFIG_USB_NET_HOST) as a module.  Load the module
83
"usb-net-host.o" and connect the USB cable to the assabet.  Configure
84
the usb network interface with
85
 
86
        /sbin/ifconfig usb0 1.1.1.1
87
 
88
You should be able to "ping" the assabet now with
89
 
90
        ping -c 1 1.1.1.2
91
 
92
If the assabet is running inetd the usual network services such as
93
telnet and ftp should work.
94
 
95
Oleg Drokin in 2.4.2-rmk1-np2 (08Mar01) added module config params for
96
read and write size to the usb-eth.c client to allow dynamic setting
97
of the DATA0/DATA1 packet size on the usb wire:
98
 
99
usb_rsize - number of bytes in OUT packets from host to SA1100
100
usb_wsize - number of bytes in IN packets from SA1100 to host
101
 
102
This allows dynamic tuning for performance or to prevent overruning
103
the the host with data.
104
 
105
4. Known Issues
106
'''''''''''''''
107
- We are fiddling with various ways to set the IMP register in
108
usb_send.c. A small percentage of the time, this value does not
109
"take."
110
 
111
- I've started to bring back the /proc interface, but clients
112
of the sa-usb core currently don't have a directory or something
113
to put their stats into.
114
 
115
- Only a useful subset of ep0 setup calls have been implemented.
116
 
117
 
118
5. Mysteries of the Universe
119
''''''''''''''''''''''''''''
120
This driver has been hard to develop because the documentation
121
provided by Intel is incomplete, and the UDC itself seems to have a
122
variety of bugs. The errata for the part is particularly scary! This
123
section is an attempt to document some of the discoveries and
124
questions I have come across while working on this thing.
125
 
126
pp 11-63 of the "Intel Strong ARM SA-1110 Microprocessor Advanced
127
Developer Information" give an ominous warning about how "due to
128
internal synchronization required by the UDC configuration registers,
129
it is possible for the procesor to write the UDC refisters and FIFOs
130
too fast." This has led to a variety of approaches that attempt to
131
bang on the hardware repeatedly and read it back until the write
132
"sticks."
133
 
134
All of these approaches have been problematic. Currently some macros
135
in udc_ctl.h that Nicolas wrote are being used. My hardware guy told
136
me that writes would never be "lost" but stuck on some internal bus in
137
the UDC module and propagated to the rest of the circuit when the time
138
was right. Indeed this seemed to be the case, for example, it seems
139
impossible to reliably read back the interrupt mask register of the UDC when in
140
the interrupt service routine. Often times the state was not reflected
141
on a read until after pending interrupt sources were cleared.
142
 
143
I was feeling prety good about this and was ripping out the looping
144
macros right and left until I came upon a situation where, while
145
receiving a continuous set of 1 character packets, ep1 (usb_receive.c)
146
could not clear receive packet complete (RPC). After much desperate
147
faliling about it turns out changing the UDC_flip() macro to bang like
148
crazy on the RPC bit did in fact clear it, and clear it
149
consistently. So go figure.
150
 
151
Other items of interest:
152
 
153
- Upon emerging from a reset, the UDC will clear the mask register except
154
for a mask on suspend.
155
 
156
- USB 1.0 spec says maximum size of a DATA0/1 packet is 64 bytes,
157
which is what the character driver is using. However, the UDC can do
158
256 bytes and every host I've tried can handle it, even though they
159
are not required to. (Perhaps it is a problem when hubs are on the
160
line, but the SA UDC has other problems in a hub environment -- like
161
even getting the correct address -- per the errata).
162
 
163
- Endpoint zero FIFOs: ARGHHH! Just leave those routines alone.
164
Believe me, I have tried every other variation you can think of.
165
Probably.
166
 
167
- Sometimes I get a setup request of 0x80 from Windows hosts. I have
168
not determined if this is a read_fifo error (none is reported) or if
169
this is some undocumented secret Redmond handshake only known to
170
initiates of the inner-order.
171
 
172
6. Test Program
173
'''''''''''''''
174
This is now in the /proc interface. (For good or ill, probably don't
175
actually need to dump all this stuff..)
176
 
177
7. Errors and Notes on Intel's 1110 Documentation
178
'''''''''''''''''''''''''''''''''''''''''''''''''
179
These corrections apply to "Intel StrongARM SA-1110 Microprocessor,
180
Advanced Developer's Manual of December 1999" Some of these have been
181
corrected in later editions, some not. There have been several updates
182
to this document published through 2000. Always use the latest
183
available on http://developer.intel.com/design/strong/collateral.htm.
184
 
185
pp 11-65 section 11.8.3.8 bit 2, reserved is now the resume interrupt
186
mask. SRM is now SUSIM on SA-1110, and masks only the suspend
187
interrupt.
188
 
189
pp 11-67 section 11.8.6, Max IN register, end should be 9 _bytes_
190
not 9 bits.
191
 
192
pp 11-68 section 11.8.7.3, SST. This is set by the CPU _not_ the UDC.
193
And it looks like you don't get a SST if you FST yourself.
194
 
195
pp 11-68 section 11.8.7.5, DE. This is set by the CPU _not_ the UDC.
196
 
197
pp 11-73 section 11.8.9.7, UDCCS2 table, bit 2, Should be "valid only
198
when _TPC_ (not RPC) is set.
199
 
200
pp 11-74 section 11.8.10, should end with a GET_DESCRIPTOR _or
201
similar_ command. (Like, for example, GET_CONFIGURATION).
202
 
203
 
204
8. Change History
205
'''''''''''''''''
206
Following are current chages  8Mar01 (released in 2.4.2-rmk1-np2?)
207
 
208
- Resetting UDC when coming out of suspend helped enumeration get
209
going considerably.
210
 
211
- Added support for client-supplied notify routine to be called
212
by the USB core when core reaches "configured" state.
213
 
214
- Added error returns from interrupt reads and buffer flush ioctl
215
calls to usb-char. Added usb-char.h file for ioctl calls.
216
 
217
- Fixed bug that kept usb-char transmitter from working the second
218
time the module was loaded.
219
 
220
- Turned off a lot of the noise in /proc
221
 
222
- Added specialty routines in ep0 to set and clear bits.
223
 
224
- More enumeration fiddling.
225
 
226
- There are horrible hacks to set max IN length in usb_send
227
  that ARE GOING AWAY SOON! REALLY!
228
 
229
*** Following changes 26Feb01 (released in 2.4.2-rmk1-np1)
230
 
231
- usb-eth integration with generic usbnet from AC tree.
232
 
233
- Creation of public interface for usb clients in sa1100_usb.h
234
and final separation into a "core" driver (usb_ctl.c, usb_ep0.c
235
usb_recv.c usb_send.c) and "client" services (usb-eth.c and
236
usb-char.c). Modularized.
237
 
238
- Descriptor handling rewritten. Support for string descriptors
239
added. More bugs in ep0 fixed. More setup packets handled.
240
 
241
- /proc interface in usb_ctl returning
242
 
243
- removed client specific stuff from usbd_info_t and hid the
244
structure in usb_ctl. Removed RAM-backing of address and pktsize
245
in this structure. Now the descriptor values are gospel.
246
 
247
- usb_dbg.h eliminated
248
 
249
- Many bugs fixed in usb-char.c
250
 
251
- Fiddled startup sequence so should start everytime.
252
 
253
- Arch specific "soft connect" hook in usb_ctl.c
254
 
255
- Bumped the interation count in write/set/clear macros
256
in usb_ctl.h up to 10000. This seemed to help various bit
257
setting in ep0 and usb_send.c.
258
 
259
*** Following changes 10Feb01 release:
260
 
261
- endpoint zero entirely rewitten
262
 
263
- Various changes by Oleg to make Netlink work again after the
264
  2.4.1-rmk1-np1 release.
265
 
266
- Resetting of new max packet length done after clearing TPC
267
in usb_send, per Nicolas Pitre.
268
 
269
 
270
*** Following changes 23Jan01 (came out in 2.4.1-rmk1-np1):
271
 
272
- Moved host initiated SET/GET feature stall into endpoint code of
273
usb_send.c and usb_receive.c and removed stallep from usb_ctl.c
274
Opposite of a SET_FEATURE stall is a reset, so no code to unstall is
275
provided.
276
 
277
- Added explicit USB state machine to usb_ctl so driver and device
278
state can be tracked closely and explicitly. Added hard-wired
279
notification routines in endpoints 1 and 2 so they can track device
280
state changes as required. State machine has notion of "zombie" state
281
the covers USB states NONATTACHED, ATTACHED and POWERED since these
282
are murky, and USB driver currently has no way to differentiate
283
between the two.
284
 
285
- Reworked ISR in usb_ctl so reset has higher priority than any other
286
event. Stopped using sync macros to clear interrupt pending flags and set
287
mask registers since it appears mask register changes are not
288
always reflected on a mask register read until the pending flag is
289
cleared (yet other tests show they are always cleared
290
eventually). Toggle suspend/resume interrupt masks back and forth during
291
suspend and resume to debounce and keep UDC internal state machine in
292
sync per Intel documentation.
293
 
294
- Flipped UDC flip, clear, write and set macros from do{}while to
295
while() loops. Theory is you might save a loop iteration if value
296
becomes valid immediately. Also, my hardware guy says writes are never
297
"lost", just pipelined and not executed immediately depending on
298
internal device conditions (like setting int masks when ints
299
pending), so moved write cycles in macros outside of loops.
300
 
301
- Added #defines to SA-1110.h for suspend and resume interrupt mask
302
bits per Intel eratta. Submitted to ARM patch system (444/1).
303
 
304
- Removed task queue and defered execution of configure() from
305
usb_ctl.
306
 
307
- Removed usb_write_reg() from usb_ctl.c, and various cruft from
308
usb_ctl.h.
309
 
310
- Added sa1100_usb_xmitter_avail() to usb_send.c. Makes implementing
311
poll() fileop easier.
312
 
313
- Added sa1100_usb_send_reset() to usb_send.c. Makes implementing
314
transmitter timeout easier.
315
 
316
- Added API to usb_ctl to set vendor and product ID
317
 
318
- Changed BMATTR descriptor fron int to bulk, when not using netlink. (All
319
the docs say UDC does not support INT xfers -- though, at the protocol
320
level I don't see why not, since bulk and int are both just
321
IN-DATA-ACK. I figure netlink may rely on this, and not just a
322
continuous pending read from the host, but for "pure bulk" host
323
polling may not be generally correct.)
324
 
325
- Removed unused rx_lock and tx_lock from usb_ctl
326
 
327
- Converted everyone to SA-1100.h and nuked hardware defines in usb_ctl.h
328
 
329
- Removed udc_init() in usb_ctl.c and folded functionality into udc_start().
330
 
331
- Clear force stall (FST) in udc_start and reset so UDC actually runs when
332
first turned on.
333
 
334
- Emit NAK in receiver until ep1_start() for error (RPE) case too.
335
 
336
- Remove enable/disable UDC from reset handler in udc_ctl. The UDC has
337
already been reset, so no need to do this again.
338
 
339
- Explicitly set address to zero in ep0_reset()
340
 
341
- Added "naking" boolean to usb_receiv.c. An attempt to solve a
342
hypothetical race condition where we are in the critical section
343
initiating a read from base-level code, a RPC happens, and start()
344
might clear the condition before the packet is handled by the ISR.

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.