?lang_form? ?lang_select? ?lang_submit? ?lang_endform?
{HEADER END}
{BLAME START}

library

?curdirlinks? -

Blame information for rev 32

Line No. Rev Author Line
1 32 kaklik /******************************************************************************
2  
3 USB Hardware Abstraction Layer (HAL) (Header File)
4  
5 Summary:
6 This file abstracts the hardware interface. The USB stack firmware can be
7 compiled to work on different USB microcontrollers, such as PIC18 and PIC24.
8 The USB related special function registers and bit names are generally very
9 similar between the device families, but small differences in naming exist.
10  
11 Description:
12 This file abstracts the hardware interface. The USB stack firmware can be
13 compiled to work on different USB microcontrollers, such as PIC18 and PIC24.
14 The USB related special function registers and bit names are generally very
15 similar between the device families, but small differences in naming exist.
16  
17 In order to make the same set of firmware work accross the device families,
18 when modifying SFR contents, a slightly abstracted name is used, which is
19 then "mapped" to the appropriate real name in the usb_hal_picxx.h header.
20  
21 Make sure to include the correct version of the usb_hal_picxx.h file for
22 the microcontroller family which will be used.
23  
24 This file is located in the "\<Install Directory\>\\Microchip\\Include\\USB"
25 directory.
26  
27 When including this file in a new project, this file can either be
28 referenced from the directory in which it was installed or copied
29 directly into the user application folder. If the first method is
30 chosen to keep the file located in the folder in which it is installed
31 then include paths need to be added so that the library and the
32 application both know where to reference each others files. If the
33 application folder is located in the same folder as the Microchip
34 folder (like the current demo folders), then the following include
35 paths need to be added to the application's project:
36  
37 .
38  
39 ..\\..\\MicrochipInclude
40  
41 If a different directory structure is used, modify the paths as
42 required. An example using absolute paths instead of relative paths
43 would be the following:
44  
45 C:\\Microchip Solutions\\Microchip\\Include
46  
47 C:\\Microchip Solutions\\My Demo Application
48  
49 *******************************************************************************/
50 //DOM-IGNORE-BEGIN
51 /******************************************************************************
52  
53 File Description:
54  
55 This file defines the interface to the USB hardware abstraction layer.
56  
57 * Filename: usb_hal_pic18.h
58 Dependencies: See INCLUDES section
59 Processor: Use this header file when using this firmware with PIC18 USB
60 microcontrollers
61 Hardware:
62 Complier: Microchip C18 (for PIC18)
63 Company: Microchip Technology, Inc.
64  
65 Software License Agreement:
66  
67 The software supplied herewith by Microchip Technology Incorporated
68 (the “Company”) for its PIC® Microcontroller is intended and
69 supplied to you, the Company’s customer, for use solely and
70 exclusively on Microchip PIC Microcontroller products. The
71 software is owned by the Company and/or its supplier, and is
72 protected under applicable copyright laws. All rights are reserved.
73 Any use in violation of the foregoing restrictions may subject the
74 user to criminal sanctions under applicable laws, as well as to
75 civil liability for the breach of the terms and conditions of this
76 license.
77  
78 THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES,
79 WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
80 TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
81 PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
82 IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
83 CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
84  
85 *************************************************************************/
86  
87 //DOM-IGNORE-BEGIN
88 /********************************************************************
89 Change History:
90 Rev Description
91 ---- -----------
92 2.6 Changed the inplementation of the interrupt clearing macro
93 to be more efficient.
94  
95 2.6a Added DisableNonZeroEndpoints() function
96  
97 2.7 Added ConvertToPhysicalAddress() and ConvertToVirtualAddress()
98 macros. Needed for compatiblity with PIC32.
99  
100 Added USBDisableInterrupts() macro. Fixes issue in dual role
101 example where a device in polling mode can still have interrupts
102 enabled from the host mode causing an incorrect vectoring to the
103 host interrupt controller while in device mode.
104  
105 2.7a No change
106 ********************************************************************/
107 //DOM-IGNORE-END
108  
109 #ifndef USB_HAL_PIC18_H
110 #define USB_HAL_PIC18_H
111  
112 /****************************************************************
113 Function:
114 void USBPowerModule(void)
115  
116 Description:
117 This macro is used to power up the USB module if required<br>
118 PIC18: defines as nothing<br>
119 PIC24: defines as U1PWRCbits.USBPWR = 1;<br>
120  
121 Parameters:
122 None
123  
124 Return Values:
125 None
126  
127 Remarks:
128 None
129  
130 ****************************************************************/
131 #define USBPowerModule()
132  
133 /****************************************************************
134 Function:
135 void USBModuleDisable(void)
136  
137 Description:
138 This macro is used to disable the USB module
139  
140 Parameters:
141 None
142  
143 Return Values:
144 None
145  
146 Remarks:
147 None
148  
149 ****************************************************************/
150 #define USBModuleDisable() {\
151 UCON = 0;\
152 UIE = 0;\
153 USBDeviceState = DETACHED_STATE;\
154 }
155  
156 /****************************************************************
157 Function:
158 USBSetBDTAddress(addr)
159  
160 Description:
161 This macro is used to power up the USB module if required
162  
163 Parameters:
164 None
165  
166 Return Values:
167 None
168  
169 Remarks:
170 None
171  
172 ****************************************************************/
173 #define USBSetBDTAddress(addr)
174  
175 /********************************************************************
176 * Function (macro): void USBClearInterruptFlag(register, BYTE if_and_flag_mask)
177 *
178 * PreCondition: None
179 *
180 * Input:
181 * register - the register mnemonic for the register holding the interrupt
182 flag to be cleared
183 * BYTE if_and_flag_mask - an AND mask for the interrupt flag that will be
184 cleared
185 *
186 * Output: None
187 *
188 * Side Effects: None
189 *
190 * Overview: Clears the specified USB interrupt flag.
191 *
192 * Note:
193 *******************************************************************/
194 #define USBClearInterruptFlag(reg_name, if_and_flag_mask) (reg_name &= if_and_flag_mask)
195  
196 /********************************************************************
197 Function:
198 void USBClearInterruptRegister(WORD reg)
199  
200 Summary:
201 Clears the specified interrupt register
202  
203 PreCondition:
204 None
205  
206 Parameters:
207 WORD reg - the register name that needs to be cleared
208  
209 Return Values:
210 None
211  
212 Remarks:
213 None
214  
215 *******************************************************************/
216 #define USBClearInterruptRegister(reg) reg = 0;
217  
218 /********************************************************************
219 Function:
220 void DisableNonZeroEndpoints(UINT8 last_ep_num)
221  
222 Summary:
223 Clears the control registers for the specified non-zero endpoints
224  
225 PreCondition:
226 None
227  
228 Parameters:
229 UINT8 last_ep_num - the last endpoint number to clear. This
230 number should include all endpoints used in any configuration.
231  
232 Return Values:
233 None
234  
235 Remarks:
236 None
237  
238 *******************************************************************/
239 #define DisableNonZeroEndpoints(last_ep_num) memset((void*)&U1EP1,0x00,(last_ep_num));
240  
241 #if defined(USB_DISABLE_SOF_HANDLER)
242 #define USB_SOF_INTERRUPT 0x00
243 #else
244 #define USB_SOF_INTERRUPT 0x40
245 #endif
246  
247 #if defined(USB_DISABLE_ERROR_HANDLER)
248 #define USB_ERROR_INTERRUPT 0x02
249 #else
250 #define USB_ERROR_INTERRUPT 0x02
251 #endif
252  
253 //STALLIE, IDLEIE, TRNIE, and URSTIE are all enabled by default and are required
254 #if defined(USB_INTERRUPT)
255 #define USBEnableInterrupts() {RCONbits.IPEN = 1;IPR2bits.USBIP = 1;PIE2bits.USBIE = 1;INTCONbits.GIEH = 1;}
256 #else
257 #define USBEnableInterrupts()
258 #endif
259  
260 #define USBDisableInterrupts() {PIE2bits.USBIE = 0;}
261 #if defined(USB_INTERRUPT)
262 #define USBMaskInterrupts() {PIE2bits.USBIE = 0;}
263 #define USBUnmaskInterrupts() {PIE2bits.USBIE = 1;}
264 #else
265 #define USBMaskInterrupts()
266 #define USBUnmaskInterrupts()
267 #endif
268  
269 #define ENDPOINT_MASK 0b01111000
270  
271  
272 #define USBPingPongBufferReset UCONbits.PPBRST
273  
274  
275 #define USBTransactionCompleteIE UIEbits.TRNIE
276 #define USBTransactionCompleteIF UIRbits.TRNIF
277 #define USBTransactionCompleteIFReg UIR
278 #define USBTransactionCompleteIFBitNum 0xF7 //AND mask for clearing TRNIF bit position 4
279  
280 #define USBResetIE UIEbits.URSTIE
281 #define USBResetIF UIRbits.URSTIF
282 #define USBResetIFReg UIR
283 #define USBResetIFBitNum 0xFE //AND mask for clearing URSTIF bit position 0
284  
285 #define USBIdleIE UIEbits.IDLEIE
286 #define USBIdleIF UIRbits.IDLEIF
287 #define USBIdleIFReg UIR
288 #define USBIdleIFBitNum 0xEF //AND mask for clearing IDLEIF bit position 5
289  
290 #define USBActivityIE UIEbits.ACTVIE
291 #define USBActivityIF UIRbits.ACTVIF
292 #define USBActivityIFReg UIR
293 #define USBActivityIFBitNum 0xFB //AND mask for clearing ACTVIF bit position 2
294  
295 #define USBSOFIE UIEbits.SOFIE
296 #define USBSOFIF UIRbits.SOFIF
297 #define USBSOFIFReg UIR
298 #define USBSOFIFBitNum 0xBF //AND mask for clearing SOFIF bit position 6
299  
300 #define USBStallIE UIEbits.STALLIE
301 #define USBStallIF UIRbits.STALLIF
302 #define USBStallIFReg UIR
303 #define USBStallIFBitNum 0xDF //AND mask for clearing STALLIF bit position 5
304  
305 #define USBErrorIE UIEbits.UERRIE
306 #define USBErrorIF UIRbits.UERRIF
307 #define USBErrorIFReg UIR
308 #define USBErrorIFBitNum 0xFD //UERRIF bit position 1. Note: This bit is read only and is cleared by clearing the enabled UEIR flags
309  
310 #define USBSE0Event UCONbits.SE0
311 #define USBSuspendControl UCONbits.SUSPND
312 #define USBPacketDisable UCONbits.PKTDIS
313 #define USBResumeControl UCONbits.RESUME
314  
315 #define U1ADDR UADDR
316 #define U1IE UIE
317 #define U1IR UIR
318 #define U1EIR UEIR
319 #define U1EIE UEIE
320 #define U1CON UCON
321 #define U1EP0 UEP0
322 #define U1CONbits UCONbits
323 #define U1EP1 UEP1
324 #define U1CNFG1 UCFG
325 #define U1STAT USTAT
326 #define U1EP0bits UEP0bits
327  
328 /* Buffer Descriptor Status Register Initialization Parameters */
329 #define _BSTALL 0x04 //Buffer Stall enable
330 #define _DTSEN 0x08 //Data Toggle Synch enable
331 #define _INCDIS 0x10 //Address increment disable
332 #define _KEN 0x20 //SIE keeps buff descriptors enable
333 #define _DAT0 0x00 //DATA0 packet expected next
334 #define _DAT1 0x40 //DATA1 packet expected next
335 #define _DTSMASK 0x40 //DTS Mask
336 #define _USIE 0x80 //SIE owns buffer
337 #define _UCPU 0x00 //CPU owns buffer
338  
339 #define _STAT_MASK 0xFF
340  
341 /* BDT entry structure definition */
342 typedef union _BD_STAT
343 {
344 BYTE Val;
345 struct{
346 //If the CPU owns the buffer then these are the values
347 unsigned BC8:1; //bit 8 of the byte count
348 unsigned BC9:1; //bit 9 of the byte count
349 unsigned BSTALL:1; //Buffer Stall Enable
350 unsigned DTSEN:1; //Data Toggle Synch Enable
351 unsigned INCDIS:1; //Address Increment Disable
352 unsigned KEN:1; //BD Keep Enable
353 unsigned DTS:1; //Data Toggle Synch Value
354 unsigned UOWN:1; //USB Ownership
355 };
356 struct{
357 //if the USB module owns the buffer then these are
358 // the values
359 unsigned BC8:1; //bit 8 of the byte count
360 unsigned BC9:1; //bit 9 of the byte count
361 unsigned PID0:1; //Packet Identifier
362 unsigned PID1:1;
363 unsigned PID2:1;
364 unsigned PID3:1;
365 unsigned :1;
366 unsigned UOWN:1; //USB Ownership
367 };
368 struct{
369 unsigned :2;
370 unsigned PID:4; //Packet Identifier
371 unsigned :2;
372 };
373 } BD_STAT; //Buffer Descriptor Status Register
374  
375 // BDT Entry Layout
376 typedef union __BDT
377 {
378 struct
379 {
380 BD_STAT STAT;
381 BYTE CNT;
382 BYTE ADRL; //Buffer Address Low
383 BYTE ADRH; //Buffer Address High
384 };
385 struct
386 {
387 unsigned :8;
388 unsigned :8;
389 WORD ADR; //Buffer Address
390 };
391 DWORD Val;
392 BYTE v[4];
393 } BDT_ENTRY;
394  
395 //Definitions for the BDT
396 #ifndef USB_PING_PONG_MODE
397 #error "No ping pong mode defined."
398 #endif
399  
400 #if (USB_PING_PONG_MODE == USB_PING_PONG__NO_PING_PONG)
401 extern volatile BDT_ENTRY BDT[(USB_MAX_EP_NUMBER + 1) * 2];
402 #elif (USB_PING_PONG_MODE == USB_PING_PONG__EP0_OUT_ONLY)
403 extern volatile BDT_ENTRY BDT[((USB_MAX_EP_NUMBER+1) * 2)+1];
404 #elif (USB_PING_PONG_MODE == USB_PING_PONG__FULL_PING_PONG)
405 extern volatile BDT_ENTRY BDT[(USB_MAX_EP_NUMBER + 1) * 4];
406 #elif (USB_PING_PONG_MODE == USB_PING_PONG__ALL_BUT_EP0)
407 extern volatile BDT_ENTRY BDT[((USB_MAX_EP_NUMBER + 1) * 4)-2];
408 #else
409 #error "No ping pong mode defined."
410 #endif
411  
412 #define USTAT_EP0_PP_MASK ~0x02
413 #define USTAT_EP_MASK 0x7E
414 #define USTAT_EP0_OUT 0x00
415 #define USTAT_EP0_OUT_EVEN 0x00
416 #define USTAT_EP0_OUT_ODD 0x02
417  
418 #define USTAT_EP0_IN 0x04
419 #define USTAT_EP0_IN_EVEN 0x04
420 #define USTAT_EP0_IN_ODD 0x06
421  
422 typedef union
423 {
424 WORD UEP[16];
425 } _UEP;
426  
427 #define UEP_STALL 0x0001
428  
429 #define USB_BDT_ADDRESS 0x400
430  
431 typedef union _POINTER
432 {
433 struct
434 {
435 BYTE bLow;
436 BYTE bHigh;
437 //byte bUpper;
438 };
439 WORD _word; // bLow & bHigh
440  
441 //pFunc _pFunc; // Usage: ptr.pFunc(); Init: ptr.pFunc = &<Function>;
442  
443 BYTE* bRam; // Ram byte pointer: 2 bytes pointer pointing
444 // to 1 byte of data
445 WORD* wRam; // Ram word poitner: 2 bytes poitner pointing
446 // to 2 bytes of data
447  
448 ROM BYTE* bRom; // Size depends on compiler setting
449 ROM WORD* wRom;
450 //rom near byte* nbRom; // Near = 2 bytes pointer
451 //rom near word* nwRom;
452 //rom far byte* fbRom; // Far = 3 bytes pointer
453 //rom far word* fwRom;
454 } POINTER;
455  
456 //******** Depricated: v2.2 - will be removed at some point of time ***
457 #define _LS 0x00 // Use Low-Speed USB Mode
458 #define _FS 0x04 // Use Full-Speed USB Mode
459 #define _TRINT 0x00 // Use internal transceiver
460 #define _TREXT 0x08 // Use external transceiver
461 #define _PUEN 0x10 // Use internal pull-up resistor
462 #define _OEMON 0x40 // Use SIE output indicator
463 //**********************************************************************
464  
465 #define USB_PULLUP_ENABLE 0x10
466 #define USB_PULLUP_DISABLED 0x00
467  
468 #define USB_INTERNAL_TRANSCEIVER 0x00
469 #define USB_EXTERNAL_TRANSCEIVER 0x08
470  
471 #define USB_FULL_SPEED 0x04
472 #define USB_LOW_SPEED 0x00
473  
474 #define ConvertToPhysicalAddress(a) ((WORD)(a))
475 #define ConvertToVirtualAddress(a) ((void *)(a))
476 #define USBClearUSBInterrupt() PIR2bits.USBIF = 0;
477  
478 #if !defined(USBDEVICE_C)
479 //extern USB_VOLATILE USB_DEVICE_STATE USBDeviceState;
480 extern USB_VOLATILE BYTE USBActiveConfiguration;
481 extern USB_VOLATILE IN_PIPE inPipes[1];
482 extern USB_VOLATILE OUT_PIPE outPipes[1];
483 extern volatile BDT_ENTRY *pBDTEntryIn[USB_MAX_EP_NUMBER+1];
484 #endif
485  
486 /* Endpoint configuration options for USBEnableEndpoint() function */
487 #define EP_CTRL 0x06 // Cfg Control pipe for this ep
488 #define EP_OUT 0x0C // Cfg OUT only pipe for this ep
489 #define EP_IN 0x0A // Cfg IN only pipe for this ep
490 #define EP_OUT_IN 0x0E // Cfg both OUT & IN pipes for this ep
491  
492 // Handshake should be disable for isoch
493 #define USB_HANDSHAKE_ENABLED 0x10
494 #define USB_HANDSHAKE_DISABLED 0x00
495  
496 #define USB_OUT_ENABLED 0x04
497 #define USB_OUT_DISABLED 0x00
498  
499 #define USB_IN_ENABLED 0x02
500 #define USB_IN_DISABLED 0x00
501  
502 #define USB_ALLOW_SETUP 0x00
503 #define USB_DISALLOW_SETUP 0x08
504  
505 #define USB_STALL_ENDPOINT 0x01
506  
507 #define SetConfigurationOptions() {\
508 U1CNFG1 = USB_PULLUP_OPTION | USB_TRANSCEIVER_OPTION | USB_SPEED_OPTION | USB_PING_PONG_MODE;\
509 U1EIE = 0x9F;\
510 UIE = 0x39 | USB_SOF_INTERRUPT | USB_ERROR_INTERRUPT;\
511 }
512  
513 #endif //#ifndef USB_HAL_PIC18_H
{BLAME END}
{FOOTER START}

Powered by WebSVN v2.8.3