-
Notifications
You must be signed in to change notification settings - Fork 94
/
README.txt
293 lines (246 loc) · 11.6 KB
/
README.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
M-Stack: Free USB Stack for PIC 16F, 18F, 24F, and 32MX Microcontrollers
==========================================================================
About
======
A USB device stack is the software necessary to drive the USB device
peripheral hardware on a microcontroller (MCU) or other device. Typically a
USB peripheral only supports the transaction level and below of the USB
protocol. Enumeration and transfers are left to the firmware or software to
implement. The Microchip PIC line of microcontrollers work exactly this
way.
M-Stack is a functional, well-documented, open source implementation of a
USB stack for Microchip PIC platforms. It performs the following
operations:
* USB device hardware initialization
* USB interrupt handling
* Management of the serial interface engine SIE
* Management of endpoints
* Fragmentation and reassembly of control transfers
* Handling and sending standard setup requests
* Enumeration
The following device classes are supported:
* HID - Human Interface Device
* CDC-ACM - Communication Device Class - Abstract Control Model
* Mass Storage Class (MSC) with MMC/SD card support
Other features include:
* Clean, well-documented examples (device, and PC-host (libusb))
* Fast PIC24 bootloader
While having a working USB stack is of great benefit when starting a USB
project, know that there is no substitute for actually knowing the details
of how USB works. The USB specification should be consulted frequently when
creating a USB device.
Home
-----
The master web page for this project can be found at:
http://www.signal11.us/oss/m-stack/
License
========
The software is dual-licensed under the GNU Lesser General Public License
(LGPL) version 3.0 and the Apache License, version 2.0. It may be used
under the terms of either one of these licenses as seen fit. It may be
used in commercial and open hardware projects so long as the conditions of
one of these licenses can be met.
Separate commercial licenses are available for purchase for companies and
projects which cannot or wish to not comply with the terms of the LGPL or
Apache License.
Contribution
-------------
Code contributions to the project are welcome, but know that copyright on
code submitted will need to be assigned to Signal 11 Software. Shared
copyright is permissible.
Support
--------
Free support for this product is be somewhat limited. A mailing list will
be setup soon.
Paid support is available through Signal 11 Software.
Consulting Services
--------------------
USB is hard. There's no getting around it. There's a good chance if you're
reading this that USB is not the main focus of your project. USB is a means
to an end, and your specialization is likely more related to the end than to
the means. Given that, doesn't it makes sense to hire someone to help you
with the USB aspect of your project? Many find that hiring specialized
consultants for specialized jobs can drastically reduce the total cost of a
project. Signal 11 can help you. This software testifies to the expertise
Signal 11 Software has with respect to USB and software development. See
the website at http://www.signal11.us for more information.
Getting Started
================
Downloading the Software
-------------------------
M-Stack's source code is currently hosted on Github at:
https://github.com/signal11/m-stack
To get the latest version, run:
git clone https://github.com/signal11/m-stack.git
Documentation
--------------
M-Stack has Doxygen-generated documentation at:
http://www.signal11.us/oss/m-stack/m-stack/html/group__public__api.html
Supported hardware
-------------------
M-Stack has currently been tested on PIC16F, PIC18F PIC24F, and PIC32MX
devices. Microchip has obviously made a conscious effort to make the
register-level interfaces to their USB peripherals as similar as possible
across MCUs and even across MCU families. While many devices should be able
to be easily supported with this software, there are often times small
differences which need to be worked out, the biggest of which being buffer
descriptor and data buffer locations with respect to the DMA capabilities of
the microcontroller being used.
The following MCU's and configurations have been tested:
* PIC32MX460F512L - PIC32 USB Starter Board
* PIC24FJ64GB002
* PIC24FJ256DA206
* PIC18F46J50 - PIC18F Starter Kit
* PIC16F1459
* PIC16F1454 - similar to PIC16F1459
If your hardware is not supported, and it's in the PIC16F/18F/24F/32MX
family, I can probably easily make you a port without very much trouble.
The easiest way is for you to send me a development board. If your hardware
is in another MCU family which is not currently supported, I can also make
you a port, but it will be more effort. In either case, I'd be happy to
talk with you about it.
Supported Software
-------------------
The USB stack is supported by the following software:
* Microchip XC8 compiler
* Microchip XC16 compiler
* Microchip XC32 compiler
* Microchip MPLAB X IDE
Note that the C18 compiler is not currently supported. There are some
#defines in the code for C18 because this project came from code that was
originally done on a PIC18F4550 using C18. It has not yet been determined
whether a port to C18 will be made, as C18 has been deprecated by Microchip.
Further, C18 has some properties which make a port somewhat more difficult
than other compilers.
Building the Unit Test Firmware
--------------------------------
Open the MPLAB.X project in apps/unit_test in the MPLAB X IDE. Select a
configuration and build. Make sure a supported compiler is installed.
Building the Test Software
---------------------------
The host_test/ directory contains Libusb-based test programs for testing the
functionality of a USB device running the unit test firmware. Currently the
Libusb test software has only been tested Linux, but since its only
dependency is the cross-platform Libusb library, it is easily portable to
other operating systems on which Libusb is supported.
With Libusb installed, run "make" in the host_test/ directory to build the
test software.
Running the Test Software
--------------------------
./control_transfer_in [number_of_bytes]
* Execute an IN control transfer requesting number_of_bytes bytes
from the device. The data returned will be printed. The unit test
firmware supports control transfers up to 512 bytes.
./control_transfer_out [number_of_bytes]
* Execute an OUT control transfer sending number_of_bytes bytes
to the device. A message will be printed. The unit test
firmware supports control transfers up to 512 bytes.
./test [number_of_bytes]
* Send and then ask for number_of_bytes bytes on EP 1 OUT and EP 1
IN, respectively. The data is printed out. The unit test firmware
will support up to 128-bytes of this kind of operation.
./feature <clear>
* Set the Endpoint halt feature on Endpoint 1 IN. Passing the
"clear" parameter clears endpoint halt.
Source Tree Structure
----------------------
(root)
|
+- usb/ <- USB stack software
| +- include/ <- API include file directory
| +- src/ <- Source files
+- storage/ <- MMC/SD card implementation
+- include/ <- API include files
+- src/ <- Source files
+- apps/ <- Firmware USB device applications,
| examples, and tests
+- unit_test/ <- Unit test firmware
+- hid_mouse/ <- HID Mouse example
+- cdc_acm/ <- CDC/ACM virtual COM port example
+- msc_test/ <- Mass Storage Class example
+- bootloader/ <- USB bootloader firmware and software
+- host_test/ <- Software applications to run from a PC Host
USB Stack Source Files
-----------------------
usb/src/usb.c - The implementation of the USB stack.
usb/src/usb_hal.h - Hardware abstraction layer (HAL) containing
differences specific to each platform.
usb/src/usb_hid.c - Implementation of the HID class.
usb/include/usb.h - The API header for the USB stack. Applications should
#include this file.
usb/include/usb_ch9.h - Enums and structs from Chapter 9 of the USB
specification which deals with control transfers and
enumeration. An application should #include this
file from their usb_descriptors.c and from any file
which deals with control transfers.
usb/src/usb_hid.h - Enums, structs, and callbacks for the HID class
Application Source Files (Unit Test Example)
---------------------------------------------
apps/unit_test/main.c - Main program file
apps/unit_test/usb_config.h - USB stack configuration file. The USB
stack will include this file and use it
for configuration. The application
should set the #defines in this file to
suit the application's needs.
apps/unit_test/usb_descriptors.c - The application's descriptors. The
application should set the descriptors in
this file as desired to suit the
application's needs.
apps/hid_mouse/* - HID mouse example (same files as above)
Making Your Own Project
------------------------
The easiest way to create a project using M-Stack is to simply copy one of
the examples and modify it accordingly. Sometimes it's better though to do
things the hard way in order to understand better.
To create a new project, perform the following steps:
1. Create a new project with MPLAB X.
2. Copy and add the usb/ directory as a subdirectory of your project.
3. Add the usb/include directory to the include path of your project. (Note
that the include paths are relative to the Makefile. If you set up your
project like the examples, with an MPLAB.X/ subdirectory, you'll need to
add an additional ../ to the beginning of the include path).
4. Add . to the include path of your project (same note from #3 applies).
5. Copy a usb_config.h and a usb_descriptors.c file from one of the example
projects into your main project directory.
6. Modify usb_config.h to match your desired device configuration.
7. Modify usb_descriptors.c to match your device configuration.
8. If you're using a PIC16F/18F platform, add an interrupt handler similar
to one of the examples.
9. Reference main.c in one of the examples, and the Doxygen-generated
documentation to add your application logic.
10. Make sure to configure the MCU for your board (__CONFIG registers, etc.).
Limitations
============
Nothing's perfect. Here are the known limitations:
* Control transfers are supported on endpoint 0 only.
* Isochronous transfers are not supported.
* Remote wake-up is not supported.
Future Plans
=============
The following features are on the horizon:
* Support for more specific MCUs
* dsPIC33E and PIC24E support
* Isochronous transfers
References
===========
USB
----
USB Implementers Forum: http://www.usb.org
USB Specification, 2.0: http://www.usb.org/developers/docs
Jan Axelson's "USB Complete," 4th Edition: http://www.lvr.com/usbc.htm
Jan Axelson's online USB resources: http://www.lvr.com/usb.htm
Microchip PIC
--------------
Microchip Libraries for Applications: http://www.microchip.com/mla
Microchip MPLAB X: http://www.microchip.com/mplabx
Contacts
=========
Please contact Signal 11 Software directly for support or consulting help.
Sometime in the near future there will be a mailing list.
Alan Ott
Signal 11 Software
http://www.signal11.us
+1 407-222-6975
2013-04-26
2013-05-20