From a54ed0085b29f81946f3652bd412103292da7589 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Mon, 13 Jul 2009 04:46:52 +0000 Subject: [PATCH] Seperated out parts of the PrinterHost incomplete demo into a seperate Lib subdirectory. Fixed Host mode to Device mode UID change not causing a USB Disconnect event when a device was connected. --- .../PrinterHost/Lib/PrinterCommands.c | 86 +++++++++++++++++ .../PrinterHost/Lib/PrinterCommands.h | 60 ++++++++++++ .../Host/Incomplete/PrinterHost/PrinterHost.c | 87 ++++++------------ .../Host/Incomplete/PrinterHost/PrinterHost.h | 18 +--- Demos/Host/Incomplete/PrinterHost/makefile | 1 + LUFA.pnproj | 2 +- LUFA/Drivers/USB/HighLevel/USBInterrupt.c | 4 +- LUFA/Drivers/USB/HighLevel/USBTask.c | 2 +- LUFA/Drivers/USB/LowLevel/HostChapter9.c | 16 ++-- LUFA/Drivers/USB/LowLevel/HostChapter9.h | 2 +- LUFA/ManPages/Author.jpg | Bin 20591 -> 28410 bytes LUFA/ManPages/ChangeLog.txt | 1 + LUFA/ManPages/ConfiguringApps.txt | 25 +++-- LUFA/ManPages/FutureChanges.txt | 2 +- 14 files changed, 212 insertions(+), 94 deletions(-) create mode 100644 Demos/Host/Incomplete/PrinterHost/Lib/PrinterCommands.c create mode 100644 Demos/Host/Incomplete/PrinterHost/Lib/PrinterCommands.h diff --git a/Demos/Host/Incomplete/PrinterHost/Lib/PrinterCommands.c b/Demos/Host/Incomplete/PrinterHost/Lib/PrinterCommands.c new file mode 100644 index 0000000000..031289193e --- /dev/null +++ b/Demos/Host/Incomplete/PrinterHost/Lib/PrinterCommands.c @@ -0,0 +1,86 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2009. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, and distribute this software + and its documentation for any purpose and without fee is hereby + granted, provided that the above copyright notice appear in all + copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +#include "PrinterCommands.h" + +uint8_t Printer_GetDeviceID(Device_ID_String_t* DeviceIDString) +{ + uint8_t ErrorCode = HOST_SENDCONTROL_Successful; + + USB_ControlRequest = (USB_Request_Header_t) + { + bmRequestType: (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE), + bRequest: GET_DEVICE_ID, + wValue: 0, + wIndex: 0, + wLength: sizeof(DeviceIDString), + }; + + if ((ErrorCode == USB_Host_SendControlRequest(DeviceIDString)) != HOST_SENDCONTROL_Successful) + return ErrorCode; + + DeviceIDString->Length = SwapEndian_16(DeviceIDString->Length); + + /* Protect against overflow for the null terminator if the string length is equal to or larger than the buffer */ + if (DeviceIDString->Length >= sizeof(DeviceIDString->String)) + DeviceIDString->Length = sizeof(DeviceIDString->String) - 1; + + DeviceIDString->String[DeviceIDString->Length] = 0x00; + + return HOST_SENDCONTROL_Successful; +} + +uint8_t Printer_GetPortStatus(uint8_t* PortStatus) +{ + USB_ControlRequest = (USB_Request_Header_t) + { + bmRequestType: (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE), + bRequest: GET_PORT_STATUS, + wValue: 0, + wIndex: 0, + wLength: sizeof(uint8_t), + }; + + return USB_Host_SendControlRequest(PortStatus); +} + +uint8_t Printer_SoftReset(void) +{ + USB_ControlRequest = (USB_Request_Header_t) + { + bmRequestType: (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE), + bRequest: SOFT_RESET, + wValue: 0, + wIndex: 0, + wLength: 0, + }; + + return USB_Host_SendControlRequest(NULL); +} diff --git a/Demos/Host/Incomplete/PrinterHost/Lib/PrinterCommands.h b/Demos/Host/Incomplete/PrinterHost/Lib/PrinterCommands.h new file mode 100644 index 0000000000..e9c1d9fb9c --- /dev/null +++ b/Demos/Host/Incomplete/PrinterHost/Lib/PrinterCommands.h @@ -0,0 +1,60 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2009. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, and distribute this software + and its documentation for any purpose and without fee is hereby + granted, provided that the above copyright notice appear in all + copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +#ifndef _PRINTER_COMMANDS_H_ +#define _PRINTER_COMMANDS_H_ + + /* Includes: */ + #include + + #include + + /* Macros: */ + #define PROTOCOL_UNIDIRECTIONAL 0x01 + #define PROTOCOL_BIDIRECTIONAL 0x02 + #define PROTOCOL_IEEE1284 0x03 + + #define GET_DEVICE_ID 0 + #define GET_PORT_STATUS 1 + #define SOFT_RESET 2 + + /* Type Defines: */ + typedef struct + { + uint16_t Length; + uint8_t String[128]; + } Device_ID_String_t; + + /* Function Prototypes: */ + uint8_t Printer_GetDeviceID(Device_ID_String_t* DeviceIDString); + uint8_t Printer_GetPortStatus(uint8_t* PortStatus); + uint8_t Printer_SoftReset(void); + +#endif diff --git a/Demos/Host/Incomplete/PrinterHost/PrinterHost.c b/Demos/Host/Incomplete/PrinterHost/PrinterHost.c index b63f4fe22a..df80789dd3 100644 --- a/Demos/Host/Incomplete/PrinterHost/PrinterHost.c +++ b/Demos/Host/Incomplete/PrinterHost/PrinterHost.c @@ -36,7 +36,6 @@ #include "PrinterHost.h" -/* Globals */ uint8_t PrinterProtocol; @@ -115,34 +114,10 @@ void USB_Printer_Host(void) switch (USB_HostState) { case HOST_STATE_Addressed: - /* Standard request to set the device configuration to configuration 1 */ - USB_ControlRequest = (USB_Request_Header_t) - { - bmRequestType: (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE), - bRequest: REQ_SetConfiguration, - wValue: 1, - wIndex: 0, - wLength: 0, - }; - - /* Send the request, display error and wait for device detatch if request fails */ - if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) - { - puts_P(PSTR("Control Error (Set Configuration).\r\n")); - printf_P(PSTR(" -- Error Code: %d\r\n"), ErrorCode); - - /* Indicate error via status LEDs */ - LEDs_SetAllLEDs(LEDS_LED1); - - /* Wait until USB device disconnected */ - while (USB_IsConnected); - break; - } - - USB_HostState = HOST_STATE_Configured; - break; - case HOST_STATE_Configured: puts_P(PSTR("Getting Config Data.\r\n")); + + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); /* Get and process the configuration descriptor data */ if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead) @@ -161,16 +136,38 @@ void USB_Printer_Host(void) while (USB_IsConnected); break; } + + /* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */ + if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful) + { + puts_P(PSTR("Control Error (Set Configuration).\r\n")); + printf_P(PSTR(" -- Error Code: %d\r\n"), ErrorCode); + + /* Indicate error via status LEDs */ + LEDs_SetAllLEDs(LEDS_LED1); + + /* Wait until USB device disconnected */ + while (USB_IsConnected); + break; + } + USB_HostState = HOST_STATE_Configured; + break; + case HOST_STATE_Configured: puts_P(PSTR("Printer Enumerated.\r\n")); - + USB_HostState = HOST_STATE_Ready; break; case HOST_STATE_Ready: /* Indicate device busy via the status LEDs */ LEDs_SetAllLEDs(LEDS_LED3 | LEDS_LED4); - if (!(GetDeviceID())) + printf_P(PSTR("Printer Protocol: %d\r\n"), PrinterProtocol); + + puts_P(PSTR("Retrieving Device ID...\r\n")); + + Device_ID_String_t DeviceIDString; + if (Printer_GetDeviceID(&DeviceIDString) != HOST_SENDCONTROL_Successful) { /* Indicate error via status LEDs */ LEDs_SetAllLEDs(LEDS_LED1); @@ -179,6 +176,8 @@ void USB_Printer_Host(void) while (USB_IsConnected); break; } + + printf_P(PSTR("Printer Device ID: %s\r\n"), DeviceIDString.String); /* Indicate device no longer busy */ LEDs_SetAllLEDs(LEDS_LED4); @@ -189,31 +188,3 @@ void USB_Printer_Host(void) break; } } - -bool GetDeviceID(void) -{ - Device_ID_String_t DeviceIDString; - - /* Request to retrieve the device ID string */ - USB_ControlRequest = (USB_Request_Header_t) - { - bmRequestType: (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE), - bRequest: GET_DEVICE_ID, - wValue: 0, - wIndex: 0, - wLength: sizeof(DeviceIDString), - }; - - printf("Error Code: %d", USB_Host_SendControlRequest(&DeviceIDString)); - - /* Send the request, display error and wait for device detatch if request fails */ - if (USB_Host_SendControlRequest(&DeviceIDString) != HOST_SENDCONTROL_Successful) - return false; - - /* Reverse the order of the string length as it is sent in big-endian format */ - DeviceIDString.Length = SwapEndian_16(DeviceIDString.Length); - - printf("%s", DeviceIDString.String); - - return true; -} diff --git a/Demos/Host/Incomplete/PrinterHost/PrinterHost.h b/Demos/Host/Incomplete/PrinterHost/PrinterHost.h index e1649563a0..191cd7f129 100644 --- a/Demos/Host/Incomplete/PrinterHost/PrinterHost.h +++ b/Demos/Host/Incomplete/PrinterHost/PrinterHost.h @@ -39,6 +39,7 @@ #include #include "ConfigDescriptor.h" + #include "Lib/PrinterCommands.h" #include #include @@ -58,20 +59,7 @@ /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3) - - #define PROTOCOL_UNIDIRECTIONAL 0x01 - #define PROTOCOL_BIDIRECTIONAL 0x02 - #define PROTOCOL_IEEE1284 0x03 - - #define GET_DEVICE_ID 0 - - /* Type Defines: */ - typedef struct - { - uint16_t Length; - uint8_t String[128]; - } Device_ID_String_t; - + /* External Variables: */ extern uint8_t PrinterProtocol; @@ -86,6 +74,4 @@ void USB_Printer_Host(void); - bool GetDeviceID(void); - #endif diff --git a/Demos/Host/Incomplete/PrinterHost/makefile b/Demos/Host/Incomplete/PrinterHost/makefile index 21743ec614..a56d9f2a82 100644 --- a/Demos/Host/Incomplete/PrinterHost/makefile +++ b/Demos/Host/Incomplete/PrinterHost/makefile @@ -132,6 +132,7 @@ LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" # List C source files here. (C dependencies are automatically generated.) SRC = $(TARGET).c \ ConfigDescriptor.c \ + Lib/PrinterCommands.c \ $(LUFA_PATH)/LUFA/Drivers/Peripheral/SerialStream.c \ $(LUFA_PATH)/LUFA/Drivers/Peripheral/Serial.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/DevChapter9.c \ diff --git a/LUFA.pnproj b/LUFA.pnproj index 39ec033726..585f74e49a 100644 --- a/LUFA.pnproj +++ b/LUFA.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/LUFA/Drivers/USB/HighLevel/USBInterrupt.c b/LUFA/Drivers/USB/HighLevel/USBInterrupt.c index 43bc53220e..c240bef6ea 100644 --- a/LUFA/Drivers/USB/HighLevel/USBInterrupt.c +++ b/LUFA/Drivers/USB/HighLevel/USBInterrupt.c @@ -243,8 +243,8 @@ ISR(USB_GEN_vect, ISR_BLOCK) { if (USB_CurrentMode == USB_MODE_HOST) EVENT_USB_DeviceUnattached(); - else - EVENT_USB_Disconnect(); + + EVENT_USB_Disconnect(); } EVENT_USB_UIDChange(); diff --git a/LUFA/Drivers/USB/HighLevel/USBTask.c b/LUFA/Drivers/USB/HighLevel/USBTask.c index 46fcd57096..894171f246 100644 --- a/LUFA/Drivers/USB/HighLevel/USBTask.c +++ b/LUFA/Drivers/USB/HighLevel/USBTask.c @@ -39,7 +39,7 @@ volatile bool USB_IsInitialized; USB_Request_Header_t USB_ControlRequest; #if defined(USB_CAN_BE_HOST) -volatile uint8_t USB_HostState; +volatile uint8_t USB_HostState; #endif void USB_USBTask(void) diff --git a/LUFA/Drivers/USB/LowLevel/HostChapter9.c b/LUFA/Drivers/USB/LowLevel/HostChapter9.c index 2bdab7c67e..a271c06cb2 100644 --- a/LUFA/Drivers/USB/LowLevel/HostChapter9.c +++ b/LUFA/Drivers/USB/LowLevel/HostChapter9.c @@ -58,7 +58,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr) Pipe_ClearSETUP(); - if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_SetupSent))) + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_SetupSent))) goto End_Of_Control_Send; Pipe_Freeze(); @@ -76,7 +76,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr) { Pipe_Unfreeze(); - if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_InReceived))) + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived))) goto End_Of_Control_Send; if (!(Pipe_BytesInPipe())) @@ -96,12 +96,12 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr) Pipe_SetToken(PIPE_TOKEN_OUT); Pipe_Unfreeze(); - if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_OutReady))) + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady))) goto End_Of_Control_Send; Pipe_ClearOUT(); - if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_OutReady))) + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady))) goto End_Of_Control_Send; } else @@ -113,7 +113,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr) while (DataLen) { - if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_OutReady))) + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady))) goto End_Of_Control_Send; while (DataLen && (Pipe_BytesInPipe() < USB_ControlPipeSize)) @@ -125,7 +125,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr) Pipe_ClearOUT(); } - if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_OutReady))) + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady))) goto End_Of_Control_Send; Pipe_Freeze(); @@ -134,7 +134,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr) Pipe_SetToken(PIPE_TOKEN_IN); Pipe_Unfreeze(); - if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_InReceived))) + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived))) goto End_Of_Control_Send; Pipe_ClearIN(); @@ -151,7 +151,7 @@ End_Of_Control_Send: return ReturnStatus; } -static uint8_t USB_Host_Wait_For_Setup_IOS(const uint8_t WaitType) +static uint8_t USB_Host_WaitForIOS(const uint8_t WaitType) { #if (USB_HOST_TIMEOUT_MS < 0xFF) uint8_t TimeoutCounter = USB_HOST_TIMEOUT_MS; diff --git a/LUFA/Drivers/USB/LowLevel/HostChapter9.h b/LUFA/Drivers/USB/LowLevel/HostChapter9.h index 3fa5277a3b..7550bcd04f 100644 --- a/LUFA/Drivers/USB/LowLevel/HostChapter9.h +++ b/LUFA/Drivers/USB/LowLevel/HostChapter9.h @@ -90,7 +90,7 @@ /* Function Prototypes: */ #if defined(INCLUDE_FROM_HOSTCHAPTER9_C) - static uint8_t USB_Host_Wait_For_Setup_IOS(const uint8_t WaitType); + static uint8_t USB_Host_WaitForIOS(const uint8_t WaitType); #endif #endif diff --git a/LUFA/ManPages/Author.jpg b/LUFA/ManPages/Author.jpg index 71e1a08fbe7f82ca04d6538da2dd314aaca32923..e8f5541a0e3c9fe5fed08ee52def2effcd40d221 100644 GIT binary patch literal 28410 zcmbTd1yoy6v@IHn7nkC$E$%KY6faOH?!_SlcXxLR6mQYu8r)q96o;U}iW59g zHUI_y06+s!AfW<~5G@^qQU2d;6GZzh67qk3{tD6NMS2CmN30P)1Rx>*xBi}pHZn5O zfA#^qyucBg|M3_9x&2@3&tL5v-MQ4{wCFtfx%h_}zi4Ue z=<4YkSXf$F+t}LKySaOKdU^Z!hJ{B&Mn%WOrlx&M&&d3qm0eg=TvA&0tGuG2u?gJV z(%RPEKQK5nJTf{qK07zRu(-6m0)cMt?C$OVJvcnNxV*Z)xxItmKl}$SBmnY%KV<)p zxCjuqUZJ2MqoDr>E~Hmp2ty`7L8a$KBmAI&{?&zufiDDuSSICXeIF(xzb5RBx$Dep z5+(sC^TmHa`%h&5-++bw|3dcPf&C9$5CAsfI($WdOaPDuya1#h-WCSG{$H%<@!8lG z@FPg}aM`AoW7@Uu8Gur6}}o}svWE`1Wo;_(r#T3ndsZ{9O9rD_rKC#xX$ z9blZu`LQMj5-V)^m3b`;x0I4sJArDN{`nX{{>rv#4hT@X)OIl%yDefxKP+Lw%ri^X$Wc|Swmw@utRJm3+`gl=GLN@+)yKm<;8)wL-h$pFSPOw3P7xxwfhKijFe1ApxN90cX2%40I^*crKg z0JvjyFg_zgx)cWf*oj^9fzL9nKrT)t#!6PipN$RmH&x3xUg;I`Rz}TRDbb;>qtdKw3Qnh8mqWK%ehz*K-J#^s@_+T*!2JYk+vK2{%On7H7m)?Y`)~euUh1M zsk#<)`egeht|8Tb=`cvJ^wgLuzp_YT^)PKj!q?_{=*=NTOE6QSZBMv0AfR`OL7TO6*op7F~mq7rMo|38~%yrpHbcrp^5O)mD;Nb3*W zRmGX=rh}jsiH{g_ma$(;4a10gAT8ob(Vt@IFHhyMgcQxc?5@dEmch7v87{kNE+A zo;rTtVO!KXcgD$uGZKDg(_$054Pvp~OWoj9#GgIEZ4Bu%2?=};582A|gFb`(pc6NF z*K@9!1|BDVyK^_Tco4>>u2AiJrW~6BBGf+Jh(Gb=wa#!W82^q!Y}0|DA=-Qs=j%Ok zj?)^77r;cS06Q49dTx(H?RAC%M+8j9GUc``SPC0n%1Lql{^C3WFS@!+uc)b~J6t*C zlZ;P~H9_;W+2WztxM&tB2NQjQ*|Fa{@kup4Kh^-h+Kh~zUAs5aPF|Ur7v~L!hoCzt zT$n;wr#4;)IEfH*FxxY&dbzLSpvu1^uZ7)BaB_U?9SuaFv=-+#XU2=lH)AF&{MY3jmNsDW`=>dUn432B_OO#2&EvTskOeHsu zIvfH&!-WSS`MFLUr>6`ZNjgo>zdLMVR?O?X$MXI_ehE!dV0jtY@IgkBJ?o^vE@dh^ zs(jO*I@;&J$G@D`!b(>Za7)cocHf(|x{!GhNW85BiC&T4p~ZhW3ncV^54W+|4mzbp zGa9@7ezsGWS5?|3v{&tcg|W?rpITruFEM2(4*lGlmc8{zx1_{U_G>hatN8+p;HwKt zilM>kFVG<~cqe+YEo|?1P8N2}xNrm5;grihITgH+-CcdYc*xn|0G_>P9siLtYXq^a zs=3o$d;tWFkKk0og|+MQ4^|DJi%+wMpQ-nfZ&N2$b#71(Cv2KP#?l>7r6rZ+KEHm zw)Vz<40CN{528pby)FmB&eSLwXw&RKiD}Et(A*kL2wvX3Sn$mEsVo!b_BdL4d{siD zm3OxK+}T6j`TOW?AsAmnju`O2Gk{VrO2LP*N}a{jHRXDS=36#G2_7FMMtYtoS{5~z zkYKT79FI}Di}*x!HH%&Rq)b^CU(XYGsN3(A=e|eeJ=vlT{B>IpIQ`eU19zU>r zswefVkiWJ%V#o^G$gcLU{`0oRXZ!^~Oz7uz{sO@J z^Ark~{fGHTIoA}xwsEXjhs1e0Q>fxioE*)_JA4$^C@yp@+6zdXY&la$c^;!}{9$`i z3ipDpwn5(yIf2aD`CoNpD>0j4rKRHH&VS7?f=+o2OyJz!rcSnNS`hMxr^o>M@Q00@ zlFoARS6E%hUv&?{hMGM0MRj_o|nOUv;JSy9oM@AnFa?u79g zQo(FaPE0amldHpPEsxhR!68{C%pb0_+ol%KCEkr*_7Ksvh8`)-=mJTt$3(R)J*W0i zxLnauE_3Q$*Kd^KVNFh-F#hiBk|xR~>y%INC~-2ry}y-am*Nf_Ger~pUc1`?Q~O4- zEsCs!8V{t;xa~OQ3?Nb z8b0L`oVmg3$a~h0^%T)rOGUMyRIG_`yONSg7D;oZUuV4$EsXc!Bm-rvntpnO3kmMcH3Z*5G^5-YCAf$cfH%2Z1is^7 zQU^aJesHbt{Hk_mW96YhhqR~A!c;#>_U3-FO^Mahkh2;U#kreWc>UpEw8*YFk!f$& zIjjcB0WcV>Hj}DOjT%tC?X;qO4&%@y1GV(R!d{O ztOwl_RO#F@xHW-68287CYloMGPhZdp-Yp8;!UMKBK!ZEyfsSu1XXnTi-A{K3QMl5p z*Q`>U!m`4BKk*h&FyaJfLhl3N4NHk%n8t%AP`g`a zgcg&$yX)}>S5})2JhM{RL{!z5&KJhMEs9bLX_2u^{m37m@`77t&L)3nD8qzco<_6I1Rkbii}`sv28I8l${Uwdp&y@>pBA-hsb2u$=eKzc z-T6VU17|2mV+ybC1k)RhKfTFx`53#khF^oBkujy8D2v?c$20j=RZcm)YDvYkOraJE z&((JQtD{=c>}1@u?)jYZ6lJ3H^QbvBL2Q4~6Itqu7-7WIU2KRuSYc7D!i<{d2ksP~Uc~1XLw){ZI zkAGk}HfD`C%7$d+BqIXR98hkL`Db!uiw-65N$t8AVu%uu*zU33(w8O>-m? zqe?_Pj@sFv2A#WP*ISUbQ%~~Z^1zF!gtAknFM~L;q5FEjuf~Y;?b4iE*MhvIyvHb| zu5eZ^{qf+F&~;MHITm=9bb^ZP{))f@cwmH*@rUr%A!oA(r!M#*GSFc_QyOFM+wpxIul^++ z*Okt_&YU>?8j=mqCi5@88CKj&%xe0%$fi_}sxY-osG$?K$szCBVEb@vn#q9M{%D*J zJJJhrCN)SW>+0nb`iR7$izt-9l#%D~o?J<8Zm_o0wXU;FflG{ut@Rp4Z z7H5SL>ST3)-8xEmmEO^^HTv1tFQMhkB;8E2zP8to3goTEo2uN0jmL*UBR>%#@+0AK zuWx2Qur`{4ra9H{$TukZ@2sPlZ7*S0aS3B8OG*seKPA=4Rsi2#o#_J@P7MPNJPap$ zEOS=90Gexm5K@*`%Qo`fXWez9BMtM%N8KBRTs@=PHM<S7Wc|{ZDuT$Sqfrlq4k>)F&h%eqpG;SnF@IV@kfN z6yV;tJYv70nvk13%52)0!~D5dG48Ux&NXTeaJBd-{1ofY3>z4j_4b{;z0;1|G3mab z{u^K8ZssB0k<+Z?sI$9P_1UQZcz<6|lgATeL`Pd8>?_o^EpC;u?#Ujm&zraUel?Vm zOj9TyUGesDZHc=Yj;CSFwQo4wmZ7-Cz)MFjRN5b#GsYf+`Fucz)0EgfavMml<)#Jp zYw_~xSbt{Cqw=t^dRKYSY+{`Gh-9?J&)fEdSS6;n zvnfuVUF(xK|A_X}6Fj4v+1VcZ3`L&aJ!K2L z0N^T}q&6;|F^pq_T6RqcPF!F;M*c*-O^DyuYfv)@K89y!y}_bvg0^ zKz;v|dy-fL&f;}C0o_~)Go2T3q8^j%4hi6G2QL_@dN^4z zUP-7E+XVmq5!TDdp4MACrtC{yQ--k?2ELaKo2hd}Q;-z76_{&OyS3YVcmYJ3+dsJb z6)Y-51lg%anbJNBZg>|#Z=15g-!36tGkW>bTpkc(v}@ykTfBdncF`EI<{mygWr5+G z?(0ILYj0DDS$M|LTJ{yyrC8n&^xZHjy#wx7chvRfywPtSHpS!H{~yqYY(9!#Skk+`6T zH9%nEVl*iZK86PjryG>Z@W8d2beDi0(q`^X(YNg+sh34ep&PtRv5XMqipLdX``vnf z=Z;venY1f!ym%?WBNHC*qI(Zc!zd>rjiN-)yv-b@7_Dg0lo`n5a)pXc%X?q>&roy0 zU2&?X!c?xTq{)dhGQWXwJw{vRSDu>bzUJ$4Y`~bPg{C+6_Fdn<;tp6)l!OX&lIwP6 zP%IK#g5B%9pQDSI5;jd%CP z^4ZrWT@QBf0!fp=KO1N;u8xvb;0F1H)#=~c$aO!1mO0k^=}-A8=`t;s>`gH=y6g-b zarKdu$Zw8?cloag4UUzWYpt%=-Pj@miAeZDo2BRPrqSsNc{C+r2v#_+TEYKVDh&Np|QmQ?CI_cp_3#SxR0B{qiq# zDf*f0C|@!TS`fM)XVTV~bV|{c6s59Gi3$my_6CKJs9CLsaM7Y*3=oB&pE_08KjXo^ z`HIc8WNi2^F4Bx=!Ci=)`@* z5oe@Ru4b&-JIZiz0jF)D_RR6Ig#D7^va!^;mAfhNJylvF_}mn18uP^zUS9sgBU@68 z-l5guTc$JLtFgOo|J-~<*0WsDeOj%-Udfw@sk#097eLr^58sixiQXygr75Qnf<%G& z{!dKmwMH&XLBbdByIH8ZTGJ1r86_qv3)Yk|5#)v!K$05!S<2i#t7s@0Jfbb;rw-ceD`;E7(-Srw4V$9eZ0B}>yL0~5hc)a}8UxJZ=u{Su;4n01!FWUy%Ot=sP2 ziI|t`uUvLfFL{hVpK>`bxc$^t;$&?@yEzQI~Cn6kEP%{Vm2*=v3OifjrOk)K=d#K#q?QpH4qrrp=L%GSkFXsjxOkx76##}E|oj@q0q#rpF znC8}?23p2ts5yIUF7W{AH_}c{kYLBc+ z?EWjkueaxq#6-7=u)hQ9C_!cinHQ_8BTj6i46Ue^R?Ix3)ps$3yz~vPsUNXvcZGM( zhmF;@Gdg>XI&2r+#{bA0dbbt$p|zz+gvzfWr(9CGQhFt6fX5=kn%+I?K%PARoTwTv z_)W_NPF$>;x((i(T7&$wdlnqyx+ZVd?)Vx->9X{{yM$c58bMD4j7ltWzGKQQ2n+`B zDfJ=;^Qj}pDwD);4f@>tA8%+hgk!mxmPDtv8!w6ejL8~|&QuS54{%jt3^AF3S={== z!51%p!NvSHaKo)ho56>K!5B&<3me|XCS6Z7;Og)PVvHZutGQIJd`N|df?kL$NbR8` z`}L7C4K}Q~Xos8d;F)ZeleK#RTrIz<+R)gdM5AQgmSSO4fippN-;zHNUrv{F{RJ_d zOCsWTciM1TO!s3>3q^}6V5p?<5G3pcFf!uI zKj@LL>ju+Mg#8SzQNzYUmTY^1`Wk!s+cJ??ne{qA1<`^(LD%hWB@YxK^x6 zpX$!G$l28OVV>7*lJ4*PM8&`sh43#k_g#LQDz__C3&oJ#@Uy*+gXV@g)w?A*i%ZHu z)4GXA8hCxs1(C|E(jN)^in{q~kl6}N$aaT0S~besioofw9!#NU3m=d)ugtaur)Oyd z;p{)W|Muw`SUoib+43^Jg+%w8r8JW5nr4yu(cL#*;(Ot%1zAgc*jlGGXwIG()R~#K zsS+@ux!_oR6H(gc)Xa_NoxLVr7h>tDH>F74ohVF(jo#ZW00W;#2+jsqe4tX;yItBb+zk?(CMAoQyw5SRS zrEO{QEY^X~$LX~XhtgH&SsH=_jd?LQY zqd4y(HKEec{7k2uu9j~`t1OSYD{rYXb?h!HQm*E(dP9*dDfJ{IZN~gm_(*O6U2q91 zYgDd{VMv?I7Fwk@qfx8+{A)d9j1K#;_xZ~+WD}ej;+}we^(E7=Ual$94sA6$={ppQ z&?3<(Gu%WN`EJQ}jPcTRN51i&qCd~v8HfAoMCA*BV>DUa@9%X8Sy5!>vjIOrYwK(M z2EJ929^7Xsc-(CyJb^X3=t91nPtQ&#@)E={KY`7%ye&Hau|saKl011Umq!6W`whFo z+O?V#SKWrSsAt0J*-{q$wV>#?vpW;tyXWfr%gtupQ~e5muZ!w61FMC8Z`W}j9R|y9 zoX0Vg%x_j%0DaL+srqBbSGoh!j6#^A=D6EFeWEz=*Q0$>yF27V42<;Lbv$DfTx{M} zFS!Si_O_T=|3z@;g-ef9-+AKih}vNNQ-L|Xril-R749phc)0o*@~s-ee+Bxp z!f8vE;jB>f2mxB$gKml@Fb(4ccsR#Npkd7nHIF5gZz(%2-2%mNnj%ua_zE)u??5-= z8OP29f3E2q8E%SjkFDLUs%%Oii&zmA{r8SwfvYVml5CO!%aR(Sbi&^gNDTVvRu7Ew zVSUm#?&~!2(c@e#D*1y)+;WN7y|^!j`6e>VbGfH6p8*tbU()Kac1$X=8b8(3a# zGT8-{8m|>4kR0vZWf;r&%sN;L@?u5jOvtMRM&yqP7?vyu7AKu#?yo{OhXl!*W4dQ` z@Lqevd>YchNdc3Es-pda+;Km#?9aHkV@@3Dno_^w{9$hWPoy?rMjJR#Y%nKVF98erO4ITv=d9n@m3f*S~U=_X8rOsm08sgh4IF^Jzkad zH$&9ttV@!$y4c61gom1Z9bomtYH2eyS^^ zSn47ItYcZqJpRFybpMY@L{TX)iA;X8U(I9pz}sY)XNliWg`LW`8-E9TaQ9W&hmI=h zn;W5a&jI{{NEV13SgI`3@^pq(hYZPEAxCh~N&_&N8d$b8s>cx_+cJIH$W$z%!25>ruePc2-keAVrOaWFeR zbDz|;DkN6`M0ce<>M^RRWXVS|hJmz9jPE1O1Apj87uL*(VL-ECkR>;N)$qN!u0Jw8 zxL0%_?9XX!%?rSG8elJt>2F$PVC^Ho)EarN)~)RmxbVXs_pf}9tIhDGNS5vSf zhs1V>6C?VLIw?HvV|VDK(!K_HLaNB`FxSyAw%^n zg`HlzJEk5WptZgxMHa;r*~E=G2j z$CA-HNDxu{=n5JTp0x{Pm^pV3kY8?BwehpQ^&&_f;+dJGNXuYTKrbK0uzvxlCdKzO z)Z`VyV{e6FPvNzwgAJ>uMz)K(Qx=9fznr!kg`FG8ep-?8ooY|thRVl(il)3Gz0E>^ zw0;zO`f*)0>#qwn=2p89SgmfVrSJ|?Z<({cVpg)5IonDl(-Q3JAN)gXMek_9BQZ#i zX9NS6KT16$jXw$a`TE*Vi7b>!e%afi; z`6rbSZ(@sG87cML=57bq3m~C+MW1Q@TkXo)@51yDl(5{psSjg+bMK0a1uN8B|7Rt@ zmvj{>>;NTzJ8SvjpBKPG`5}=oE1M{JuOuHHN+SGG5{7f|V~h?e6W_fp!?qiW9ggaN zl&XM|ipHm?dhS@jLr&eAc4v!ZZG|eE@Yjt>3g8Gp*`Z5BBHveEy$WoX?)d^6{T^whJ_3XxHl4rRIskbHjB^M3~U@A^<*2MCE3f`r2 z!_T6B&hSD6{(Z|)1Lvdb36>W*Q`lKx=EP~I@b(Uvg(|&feuha~ov+9aJaA=|Li7)L z4xY(p8C0Aa_1?#LR2Z)g#&P9X5xyh982oDEm^?xjeQN1pY&)B-Z&xC?RMq?_eshqO zr!-9B3UBAiyeHw}4@#F{Mw1;*{(HN`i)`f7lF_ zKcSX+DKXkGx_xs-uES}3AcY}P1On%{tHuKk8QDw}a=D;wV;4eRCn$)2Tpu^3%t13s zCsk0#Uq~zOye*rl!W8F`90dFOKFS0<%Q-hB#ro}VgKTaq!pOGWmaqr%DbbCxL*jS7 z9S;8*Ro-kPo<2BJcJZ2;aC~;GY=+AcWJR*4N$%MBp?Cv9I-aLZn`K-6eN_3ki#>%r zKqt!cgCe4gq+4Yhs<5Z=v=)18FyOM6xq?-UWCzZLT!Nw)Q!=)29$-KzO zcH7jq9zmFoVhgn&uYmFptF@M;%RZDlNA>l3t+CYkO6hIssFKbZ4^^S1i30r@32CA7 z(t50ng1+p?v~5}(qmL`vN`y`vyp)voUtJQ4WOXB@@s2Qk0*K=`C}TNEHB!|DMk*hL zE(FGBOcj|Ylm$*d6lEn%&5T&NkoC4Xh;2aA1_SYh)5vL6Tjx9Rs_RqLuP0gcn%@1` zB-KQYsi9ORm#9y+*@qx2AL-uZ=pqjHozD$}>V_mk!F^EgVRy&rC~$V|1pu7(D5@;! zZnOH~UHhreEZ^h7aMMngdF12s;@n3wKsdPX%M}m$foW7ed&9+9lvKkd{|ZSPY`Cjv z9bE&6!NUI4wZRNi+uFN?O_^`}(%CJE2Ic_Srw}{zwazMohi+hr`vu60I7pafoKk$0nmQo)&c(SpicyB6)d2d;>zb+;ghdsL^P-=-G;L&asRm z4XwU?Pl7OoiZI2%utpb=eJ1y_N7{bqZfny{(}Y`jE7i5PPfxmVMzk|&5~W@p zMD*c!HMh3-nY;iNy1nk*xJGPLsySZ($d}FCE>{wbJ1>C#N_7f2k=~!urqru1Fztke z#bgq`JF%7!?(w)TAy(%2J0W(waiMzd5=i~Tlw1(+3xLGEhtOMkFncM2yU?Sp;oFdt zYyGLplh8I(_UtW05!N8f2_8+M4m1*yy4>z5+>Chvz&_KictO|a^bdRR1!^h1iw1nZ z>5ybghn7(Mg`7J5P^xKiDPJybu9wg$!T7?81HznAiG94e7^J~}Dk@wOT!0PI;&KWY zf6>hB)s}25S}n5?;Yd)&+j7$vzCY zomuy7oxk<`R%D4txw1<&udI4l2cjKIV+-Pu1D7rY2nB>J!DCtuPbF(8(W5^eD{*%c z<*g*0fw$7nnD1bTv{AQ^U15!pH)VsW>O;@uT{3Z0&Z?DmDJq3(TQbOsEmBx2-dR5J zM;t$Dwn)=q3Vp{oME?{`O_~S6n8X*IADgS6=o9+UEs1vSj$_9Gi)*LeLN;gmiMgI=xx{ZC_NRI zdJuNXSeLqV5&1qPH7-`VRCL_4ZT;v5vuvSxGxsPEAs=0!K;GySr^|T8>oY^+|GNf_BYR$kEw)rglr3v4;d)R6ch-@5kxgYT)!`03I%U z4;F}}$~{P$+05Iu7p~l>nA{fo@PVS(%Qgg{cgDHj%*CTsRWlQ|hbRURJ->d3NIrMK zqz9A2DDIN{S)r?(+}m7PKR1BcQsrf33kT6CBwLGq%;f5S6y%`=23)jWp`h>x%2 zD#dM25hSj5MBSL)Kx>E8uk_@fVCl0#<712&W1EFxPtW+D97MW(!Fjl7hl zxsvo-Bb&nJuVhSAmV_d7iINy1jEAO`n=ozK6@JyHoNj4ggSQn|X5TaCykOj_p`C?o zj>cx(0XQo=3n|L^$A`>j@X|JpI@~)D=vUIg6oW9^><>&O4A0EY#4j%J)EZDj;--c`|-QhAK20PrL#hc+< ze6o>JFE%pO4!KtDyRwVN>$!{PE_+ouQDH>LZjx`BS$hroNB=z8O$A3>xX7xr0_*Gp zhfiq^DPo2MWqO=-;ASQAB8ImoJM~IN%@RFA7@7(jL+Ynx15S7cG$gR;sJ|&+=jbmO z4Q(k@cPm&Z)Y3eSLCB+nIly%_8~IcjWKfoD{aa!G7TEbfyUp@7H3OxeXG?oq6SxBs zX{$T%j3qx0J{}>XGzs|1*ldm!`d}XtdUIFO5><6mfMjf!4Ph?!or((Bp|-xnpKvKP z7A3SbwRo4BWIdps$V9d#aN6^h3%J%$Mx$Mr(Ct*aV=?w^UCBfj)HCpm&^$-SP@ff9 z(C0632u@NQ*tYNtbc}&}=JEvb@a%>9_w=fZbBa7T-1baz>z9G~#ySB+#-X>07E!7f z->x=?98%=#4@~jhiIag3F3jB@=bOU2J+-05b7z!pf>TEaovhnLHHQyDF@oO*#imjj zVZwtzb?#AqGTq;Q9zQU*4^!c>d6&hS5mOplMSh6T+J_GeWD*|IaDqc+mV|^oeXGA` zS>V}K9@bJpq^hZabn8xTKy00>9b};`l)+TZxcx@Ik;ld9v&#jOVUTMJ^?c7*kny#r zUtUrihgo;*)V_T5s$Pu4d9gXxI%3+nokq$~-Gb81Z`FOzq*S=|JH={sgt345HC?v4 zR#`py996n$yVNgeopQq+<=aV-k>=`2Xs`_=4kz>?cdkqph}^sEq~E5iMiAru*nRz$XD{a{0Uu4y%Ff1q+xg?Rvtk7EfE zQ0eWaZEmSrCe)r0|uv(y6>fnr>tYAqg$;D+gea`x5~xR}K00 zrYd2LgZ*dH-LBKO+Or>Yt^il{O{u_xJVnWfsU$Cc7n>b%o$rd;&2}4Xvw!EzL~N(F zArV8txVYM@o@lcO*Za-L^ZIi2ngT)I#}JHei!<=wwUpHb_vxE|pS|Y>AfT51^H<(} z1HRT}TN9`9()jT8{R`Y$pE4z{TSdm6nIGwlsydRwc#INP@A68q6Dis6(=G~b4WG*W zjdy?`-R-1P)SZGieI-W}>QRh;rph^+69rhB8s{~KB`H-2`kZG+%IssY7**&ag}gF! zm;%S(giBAz0}rC__VqU&HDI7VI@Ab|N6th7Q?e34<{Y_kCLrN2D>6>fg|(30&eC{A z$3Z^E#iyM4+Lbx^1!!YWUQ56nO-_|DKM7p{=jWE!W!x2WsY!x2OY%#5z?;oNp+v4? z>mA}uRqY4J!|A0oM+t(E`on>Jd~iMxsdCbkQ?!`F!}LmulxsjEtoruFPwvE8s$PF`Jl-TZqvKM3?adic~$0MCSOBCmhUgp^if2bKwT zH9a^q8g(HkrxwqImlaN@yiJUTR|C5b@QR6;>=Kk&d@7u;BVOj{SLpFq5*{9({v7X%lz3Ap`3E-^=ZE^uZC9zds(8N8Qr#nRR z`suqrlN1eHet*N5gf`lDFJ&Q+`Itxbm+7Hc^4yuDesw3iBgyP~XPlnQU<+N(;jPS$Li$@ZSxBNoH-N}Nka)2-Z2e_ zWOS4q=~5&`b;?08B*bkvOZJ}jD~s#{1G8Lps2U8{4h>4iyaIlGQFpjhlxBVb^a)Fm z==t-&EPX+teO4X%rp?Vm?<}f1Z8N-tu}8Rz>@z<7kpBHCEf`m?DJaggA*$agS_7Va zWpt5IUUPJpov^ZC-9BI3KF?*Tv`gyb3|-C)Wgin1;bQzex%azK?A{ywK?Y6=m4hWk zI^5I~MYC*{On?N6NPR(D`kdD)S!0xc6ifoSvOfJL{`eNNGb%}|IdvY#?L#^Xq=u_1%Msf5IK0&aniH(0x+N*@p>eo+>&a!Xn7{lN%~s&5uxu6H!m1$mJy+2 zIsOceRbn>Ow6vo#HmDT&)NJA%B|7%Z&1KGOq)IX@OWBa_e}<~?JJ8YDS#jE2Z0SM4 z-}%pp6@08xUjVjtkhZ*XD6}N}l}TT~aI_}pli}n<7@Rg0-3D7j|S!G(}-IXYbhb@oUz0&cYJL*W5>kdDGJ3 zExpF37^*TizUZv|mnQ0#8{6Lm4-g3gOO`=5_pjDawY0 zoIdsf_=u25nf7%^Bl(lVYBH_tJ>fPo!T0@d61O0S5C@VaJ|#-1aXyg!##~EWbmAAN z0->&3ri6AN9zDu|1I-pAx98O6_ZJ2E>1E^#EQ=>Zldv&$zKN_2;E>-(lhYn@|6}l` zkj8@(l0BA?imlydE7y>kWvKkg&Qe{g$Z9&(5B&ka`q}x*f)f~=)KsxI`+9Q;dU?r8 z$)&8sT4}$z8&Hi1r}$U9e_9Ugcl>fY;04^?EjEkEXOS;LV+vU$l{ZZmz;8QeS}DD)j0Bj3=QJPZ9#P<+g=EnD+ZR8h;O3QrHiCQ!WAjKK~QQsG`M=<+9Ql#-Q_nQQk{YxNUKIiOL z*e#eKS^i@EccyPtWG$0i^0u&dt(g&9tKT5odmU7HPC)^%j#E&5TLhbi4V%7#OD zVDqCo&76~yKkYAX^9ijK5*+JcRnAm-)Z)3Cn$s%5IDLW@FLkS$HM>lVe_9G?MSLe* zmhP}~l1{{fS@;6Kblwk-82Pb>{QH$v4fdl<;MoZa|7ZM-lsmPf`}d$Ta9N7esr!Po z|5PxG@a*qkAY(&&^sAJn$*m;f2@W5E)WM^6=J1@l9}|w0NLoZ!8y(fE!tvLq@>^_D z9r$yOt9vX18ljxJA7anPj89BJz%Ss0Si<+2Zqg`Rhb4=Xf`|mjWBd-uY^s5h^zoHV zF?h18yRGo3MdO1P#s$uEgnw#s0+lp=lXlcsbsqF)8iqOd?=qpn;6<-o{Ea@ABFXcC z$}yA#t|GfFetLcvj(mEU>cF@3P*l|Cb+d4uFW|-jZuCJ3C93x30zZ=PDFNO8RDkR3 zQ)Y{|&kV5Z#SJ0YH-11AVd+o10H$z!8N)ZPKMeV@hTT+h8i?jIvlks>qWuIBSM*KA z?c|A)7ukk})eBlB7`gqMh~aZ-)0x$^JM?#B-o2aKyWd3VWfIiir!ta*DqG3vlWoezGB|S=hTjcsK0Mbx88MxT ztojAU{zDX04X6-LQ2r9^!7lH^Pv9PY~axvPRLL$FLCCl74_2*SI-X~B^qR9E_qw#HA+!*LI zD$#=-Gu(pU-J%rvAt%b${s^Gmnd7Hayml3$3=gc2;CPdSL--G+cdD$Q7XVt%7%fKN z8Ue6}>Y2l?pz$RMFJUyh?DS!fX~2mJ5Qel z_n$GJq62B*uWm;bzLKY&co#0pXNcf>Y+|j+u`4p@se!wuCg?eg^mw4AyIf@0uoT6_m?3jRb=%?83syvxESxjxn^ok=L-u+jn zfpl|DZ#0?Xwk0bKM^b0NJ+aSJrHM+;7*bZx<^E{$vmeeQsVea>rGXmn<~@-W)zP_pTVz=L%d>Zqm`Qil&>Zf2XNuP?cqpnm_{^0zEJ{w2gnEqxH z?8@}0N{!BP`{teLlU>YGP*?^{5UF02keyYkn4R(9gTcxkGnigS{ zafOh%kh{--9I~|L(uT#1Dh8z-{du>=#h(Nftwzl}*!zW`p7bJbU5t5^`IMN7nCBj@ z*7jXp<3Jl40YS8Ii*bJ^X-I8ZgXZk=rt~eix!}s0%;P)J=LIu1D}Vw`E%a1oT`L$_ z@q|B}b@>smJdd_t6S5(ZqD18!Q{t>qcva$3avY*WdvX4M1tBcn)2jK_mq2u@;DLt~e3ay5O`5dO*xqsk!8`;#1 zAr-&%_@57aMAI9@-x;-J(xHIe{l3vw8Q4h$w1V_qL1}mLZx)ZNO9X6G7TG4mzyzP= zhyDxE@KP-|;`fHWE9tRaM+<4G;olJHw^8E%07qzMSs~Nz+ybu*Q#{eYcD_Wx(TXaT z{=xnS_)^!ze-!*d;(bmyXVPzNRuzoTnC~asbv^Bi+`D2s!)q@1cPfcmBBaJL)%g$q z00lz$Hhwl}Ulpw&g40)vS4lLj16-LLY7pG$R%Y){lILVwzR-5bkUm z;dG_8(RB9QD*fLJ-Mk14bAQ3`1xSv=8(K_$T36d@;5OX zbx>oJXx3k2isko6s~SmiE-n-mJl#G=J4f>c{{RFG_%Cf~@O!~}?69ztU(_}K02f}F zAwvFDrPQ|e4vpoFqkXEQf;RyvR^hn*xOJ^AEepb)IMW!kawma2E#a6D1p!ZqZ%&&u zX}1BL%A*5@KfVkHOm*du<-@v`)?K@4{$JIOTzv0VFzCH}l08r1ww!by4tze-7y$km z_(L82!;$kn{-X_;GP^0}S9q_<$OM-o1cQpcHq~db(tKGZvzX`5z8zTjX4HZ+9;M>l zMq5WnSIs$b4V8)GBxL~S2D_QZm8|%J3v>c29}jpZ!>YjWC7$O{xSkXR@E7d27RL&z zxPHebyo1FN&#L(GJT|3{nXY_E(|+9GE5vlq2KYxz)^6Z)x8z5@igoG;-I0vocg0>h z_Fi_`zs;N%eCb~6^ZEY(O!TFP>~}X>O^7RP;r{>$cvHb}M3`W8EnhdfjALjUTv$b< zwnho_NjM4(a2_Y|5VzI!8)%{V_3sq6g`>!~F{9W^;ExO6>lW8!5Cm$v-jj5gJTIK3 ziTSbU+77X&Y1%~oBGkf<_(=Rk;vW;i=0EQSouui{XQo_&;NgD5r`Uz#A+84pzs&wG zNf%ktWOiS*=)Vs>C<@%*!!dkkGhidUb>|I z>oRwi{XgNp{SMQ{`lNb>sqp^*UnIs)igX=#BJPoj_=iZTe#~$}| zgH4({ZCWsm7EH5ErRrL~!OInoYOZ$?XYG%q-VOd@EIM6{+?%pqTfc`|rLfc;jEu@| zrSPoQ;C#DS-Zuo`RWGvB^54mRdVjzZUletFTkl`+PLsql#UF@t-9ut7oi4v=74pic zJiRZ+`dQMiZCNljh1XX~Mpi%TFMd;;Gr@_&=z=7P7arztyz4VvYoZ$NoCfZUZ7le6Jp?zBkjRw=04z zy!~;aU5dbck<;&@nup@G_|x5hqsPi;5T=EVWjPh&Jd_#H{!E>QzhFf0~c#6{A-4Nk4 z-x6p#g}hMXAjc2(h1!f|gFU7I+=^*h^w(}*>rbC@rKLx+cl_-C0HxeyS2o(dkE`jn z(=?D9KNs1;{{Xxgf@y3u%_+!s1;_SkI|H?p7CbK?b9!umYd3L)k7T|ox4w;8;svd| zTi{u)#DNd`wQmqfWO5kg;lLcIt6vMP#pGUP!);bR9F_O)CDT&yvUph;*C)(FHKPS5 zA2e)9-Gf}M{-qs`uWKx=<*)V!g)bzEBBY1#KaDP7)kpxHgz1`=n5TjAmgM$2LQnJU z&=S^B^!#mq!(+?7BVS$(XF?ITmo&P?z0OMck+ENf-Y?TxS@NVTmysZHzzHxJ_U=X; zU&Wmx>>dg5)}wbPnhv9D9_KNSk*+*Fdke`ltU|blPm|^ZDIo3uft}AA-olb1}DGaKX0YrcGwmACF1WG|v+M0AfovmE(P9Q}H&TrOt)t zvyfih>Ha8#X$;c1ur`wj{(m%Dk0=i@Lwi@j9V$N>f5I){D?6DYYmIlrT4ud<3qIRj zGXDTh(-rxmw!UUnNkg8AeGPxs-20`zYI8^>%-S-kW+@)}*;{2|Zk&ri(@Q+W!E4 z_dm|d{tActKVAF`{ipnDY^_-MOUE(~7WiiNIFwr5TIwhb)N0Y7S!EY1x!a_TD>nlG z{$tCX#IPZb;=rf}e&P=t5V#%2bDyn$V}I~n{{VrSRNn%$FBR$5$voc<^^H2`L)2k~ zVU}MBYs%KmVS1o$SuAc_%4NppTX;h+m>iGevgH7I0^kK^<8rau2^)aiGD7`>(t-LMpo56^Yd2wIe$9rz29aU^J zofbPQD{+$BJe7YSs%#-*IN*{#hK-u{QTSaJ4t0Nu9y##}D&s$9(=N5&vq;;Rl1u^u zH)ITsKs#&I!$a9&>BIR_zfPa`6$V3fa+kUr z2+W-y?Dn!Zp$mct10J#9rZ*aHpK!|H>mD@mwz2~efd}^1w$^QogS6U0eCZeFz?;M>2yBAg7sYK*jVj9W z;zJy^J{IvOi8XtY?vul*c&Ij$rNtV6ad1>!qV6QAwp9aj4CLq$OAUqNz>jTsnpTtG zjV(&-`v#X~rbno2*M=h4S!AADz5K9{SzD>vK&=v9;%z=(>-^u`4Wygz{{RF22jkG- zJPD|S;4MWYxt`|k%f;H=t;CJBw=mIlHDtJqDa!ex&tS;gv=s{A=iI&)YBKnb;eUqA zujfm1<4+PKyza`K2VCFgEN;R^1xN}`F_Pal4Sc8Y%U?^aJK~O)ZeWK`w)lbtn3ZG~ z0t<~Q+zE-u4;f3DHgZ=iPauLlr}k~t44x6wG?tMbT{Fiz&~+YaF=>1`tWKxPSdLVr zoMe&?a0_Ks==oY(UHsL*ujvyww5QU}KaRiBIXI#=9w5>u*wNbD>AF?K>meZ}`yRWg zcq>w#;T6;fEwsDKdDxI}&}WQnUC$ZC9)}!?5iDD!2bXnttTQhS7n1=(iKVwc#Y97r@+e)v#?{3 z!FruS=`Zw+3tYNIm|eGo?kA0eZYGDtwy|heDB+`HBu#aHVC*)J`1K0gfMH5HsYd?* z3%q0-klxgl^oDLbmIWzcv7>PgqO(>Hh!&bUs#;qr3jUEl)&~RJYRn zU!iIXwCU~QOBv*I`GwG6B&4LVyFMjbMvFN@wido>1w8jQYsHTHWa^ytw z6}It5hE-)^FsZ5AJaK|PSfC^vF)id@7Iiy)Y4t5i+CbJ`Akw@&<9MefKw0%44~;rl z)HAV2h|p~uu3P56+|85nl6G@e-|yS+=oHo58{R+Wzs>!{4}-IvU&ESmSwhU#{tTZ* zffTd6vuR7?PY=d6MyH+DaW7-@1HlDHYpOvt#;Jd8Iw;fPyZCK>h?2Xa+UhKZ`s;Ws zcQwM@0>HN2zjXCJfBP@$h%MVmwn*ZC4Qtw-og>RQiDtBl>rB<2Y2}efRFd;v)d(Aq zF^Q0Ht}D3K#P(C&M7e2oABS@31jb7|x~GEtMW`mB;;}&-Amz}Udtal6Myjk0L4X)LY&1S%i>5t8%ym~ zQWSt+#(pT@{{Uy-Uc61VM7H>urpL>;@^!}W_O}LPQMBzES^<;RR%PJsuI>$1D-AD3&bz4_}bG(-I;EdDPLw& zChtt}#*ZV7vJhCls@t=GL|h%DwM9miD6QIQeqXP0=|=Tjtz~Qf0A5!A05fk^w*LT% zn?${x+imux1>BNujIQR=d}C>qW*|s>$J@BK4EsUH73e>-{3X5~X>zlycCFysJE_x` z5sJr2U-SO}Bg%hd-4;7LDYX+KTQ`d?Zu~tZ_G4$${6%7kulP>!BV=It z7SgB$C~;(pe)%WUe`v|S;USyh{;c-Nhw_Tqr=5KL*e8*K@rD1N+Ndzsfi^*O5l#G z#WCsLFVQ7fOHXNkEFLD(q1s@XE%n%=j{3==D5ly$tSqS_sZx)qFc>5g5sOq6KC(&M z&qwCEYwCqoN?3<9?`LcIZPMH9ypj0-0RI35i}+!tc&GMW@$Rf9I(@ue6q@?_*%Ym^ z%QPlYt=dMTF$tO&*bD{prebT5xj{t~ zQv?0Hegnjw8u(w~TZd4CM)-SktxSY$Xynub>J1wO`}<>850*cCjFXo;+EN=I7W^@^ zk+(mEJ`(FbAirRMi0`0r#~wLRO9k2J{#+>L`sPKHQ~<-Mxl=2 z*N7}#L~2y4k#?)V$tjV*G~Gv0i~bW2i+3>XzRlm7sR=z3p-LDM`x;M8zTmOc!*)n;iIFZP+BwU$#N zw=l7i=2CcGjr=*!nOU;K;_rk|NQK(Z;kS%@L3SUN7ZS&!+04!X$IjY}fShtyt}D~^ z+v`m)NbwPf$NvBluZQv4LZPrX-a~a9D5VFf+d#s4rWq%F) z0=9uk$O$I7t6ljj2>XokXvdB|?gva$ch&99{{Rp2_=N?&m;RFf058<|d&gcn@j<@R zv}tWlwW!UlY2Gi@)?j0{O)fbuH2(kq=p?c*beB`I)Nds_O2%y^-?UDo_S#>>3y6F- zc^&P_&3k+OrDT^b5gSt1HTk2s)GjUJG7RaqmXTd$vY{d*l6C`KU&WseTU%@18ZpNj z0paZj?M|s0yw5F$zi$ziMqj*zTNy4v$y~kw`Bz-KxSI1aVsN>@hk zKZczeWzjSxlzDC9OWSpfI1J7_(Io6qVTPWuyqmu^-{tpyuVl?V+48Ge)_eZ|UY~N; zL#OybscJf_d{LGdVUI_b#g8_g%?x(Z#b>2>aut*#Or=^RlGMfs!V;>iNC3aTe$GHP zkEH4#7~bbvovvBqRB0r&@V=^&$uVP`mY9QtW?U%VaHhT__+#Tq4}iQ=f2K;d$5XTM zZMK~ZZs=BhM_AJ=tc1~~F(^pb5O*-z>NAil?hk;ib zB&h|iPbVr*3hFr}IbBlL_E-D=06jmej4(8qXzc9J=wA&&k|TC9uBoMnh6}qp8KR6}9E^p| zPtE0X>P-dqgCZ)K;`n9pGIcw)v}W^IvY&}TT>RGKA$FXuK5Pv38m-As4%)*Q^PJD{ zn$3!q+EPyvcz?`QV1afR%W^|70PW6dsl6wD-=hBjBPShc`rCgu=l7L-HFF%kDe)D! z+AYt-uNG*Cot7O>!hRmSoG51{6wb1o1pvEk$s3h2{70)BeN#x(m4pZF{{Rp5M#va> zHH%x_CsA2LsSH?LY2olrMW99tw{WfDDWX0nyP2EITd#_KF1iQ{?IPbm(=Cgtwn~#E zJndYsm@rF`T*r>CTkM)|mPYZUd@E)V5Twd{Q=^C4vB*a;mgCGE3^FbWFYGp-TmB!9 z^ozH?ywq3T(cI6hC69$HR50^&Un5Reke#8tC*sfeM#C3k13%ehxa6o^xnrJ(=gYlU z&yjT3b0xi{_l~sS3n>=*b&rp4t#q4pMQxGA4wrEXsT_=Bue5umzq*1sQc3kI z4-sk?OEfA0D7TTk18zdKvhw)^{VA`xZFfhsWi6%IYu+}~;$}wj%lL-RLDm{Hj$xQt z#nj}7JB(oDvaw_H{{X;^8s2Cxmnv2Z?K0A0WmJvixzzl2Eu182oU`14#uz9VB}v`u zUlnyxrLB&p*n-PV@n?YbtBr~`5v%xnQt-k?9UviymrRHtC_o|bGNnXP(v(|wv;A-9 zwS`vBypp?Zel|WW$(DLDP zx8`HX<@`BvmmVS1wF}i}yz@LLmS#dFk!{<>KwNAryrSA@kd{0EuRxXl(7BGXDTP z@Lu@3)r`>rnF z+)fDIGR!guh<@9USzP=d@cLiujtjYbL!dXB<|LEP*Kf4+w?-@jGqlRM&OvdLxMsGV zlq>CfH~D{G(=(>|u~Z*TKU32F6JMP};g^Q>4f5PwSm;`H{lrql-emW_51J#Xs9b{_ z_c}_+wC8vFUfwbY>2$3!IDA#A=*m=E#j0wJr%F|12GhjKzAVz^aEbFoy39J5#z+Vi zO97BLuh}37<4 z*m$eLwh~^;W4`WR1W9%gn{2)u)JCnM8MY{8o^1p?K(iT@=M>@ZUhSK?SFYHH)7U>Q>=Da*Yabli*m%MifC4yfuOK#Bx-7XrygIF&<2M0= zN<$6bd;9JErZm^_CZlZfnP*)kH7P8E?{|*g(^kF_+sB4Ec7?pL#z2sqkf6u>iT?n> zYP}2(-IQ@nHJ+uaXm?Y`f?D5L->6&2(-1+7UfSP?_{Q73o~j3nj*8}--j-_H zZEIWa)b((U^3#iVx_9+z$3HFrKBsDo58)oXb#55dtsCVbn*^S6 zNAVs31@Rck3yw(({n3Geom}vDit;p)vugLSQAHI*pY6XEq|*3m*1|&P`%A_?7gdaI z0j;8r%Jw%QNfH8W4(;S;4g4E(!pW%JU+P~K=7}0Xtb9`N--gs}3|iMn(=-;8w$vfN ze=XP}kfRwO;GaJ5=ZUZN4-WWKUB5#e?w#TP01fN6cFnonuQbbJXQ>5LU{+=GCOz4V zXccpuv%x+hOYJ(^?O9c|uZ>vPBCX-luKs{KE$Ph|1VrQ$Tx{8X_Pm})xjhcqaOXI5oYu$FA&1jmWxOpKNi zalrt2MBX)=_?P2d)Tt!0n~#V71hya?pRsAs>aK{xJCsS{xd~7J-6tEcRCRjqiQ$6D&5M{wQMGRPqa;Tpo(%qk;{{Vsd4iwr?Pb>V_`F>|}@!wl1rfS;dyn%nR zWAN6I6K-sy+eIzI?GgOP<rbZB||i)WKkjdkK(4i_P-6?>B`(|9xl1Lfj43P&7(yj1eGOB zdvv8cc>Cj$*fseleXL%1$HZ5@ABt0XqEHG=7< zaxz-_4Y=4s^WrL~w3EAOt9j`4^j!_;Q%!2DqSL>Y-;ewr$Izb%5~UCgWkwZ@|%X9ydqFqZ!SfrVUSila3aqV?sCwes@* zkYZxzs#Z={{LP07pSLoH~TK=XM zJ3A=Xawmv91q#Z$TVvSG1*rR={?$uGmy#!zj;y4Ui5ui$NX4^k6qT7C1g%BRG?7cXRvGa~%fI<&fS z7627MUe$p-FHm{lW_ZToMa8YI?>ov*g;uDW8H8%Oy3E0dD}nxm#Bkik58VN4&%6cV zD4?^A(*)V+e-w29H!xyv{9CJCCBa~nZD{zrT2$3;Hsxd4v(l0kxV`!@oqr! zqg4aql&h4CE>sQ5eqgy^A8!QLg+Zy?ydEgs$W3#^v$6+g3--Spc&_D8axlasgk*q8 zAKt<1{6*p&o*uiEnF~*U;#;DdkUM>+;zXBY%PL0DvC719KIm)^?(gJZ4>Z|4RJ!HG z!?Iaw2hT? zp3XFOa2;0HPb|4Sh9jH|+!|D+8{XGndu#gB?=YV?wv4UuS^ddB(D|#v@Y?A*l=3R< z6HTOEOvOMFT5GyJ=Y?ZP)s$_{ucF&XMghW=Zn>=66qm%`6m;ld-6U~OeKf^+50~-9_PZIBCuJT_!ioG%jJxH z-`;KswSXP>?CYt)aq(WpdAzwxNquVyvyi@XX&xyP%gDBP}5caz-(XlawL9 zyq|8TLrp@ZPO2{7g}+|M*!td>G<$h&6f{D^#$N?>4=AWlF5d50@b-aqBCt8HA!Q^T zt`v|6AwNpKChF-Hf#Pe2d@aAj-w$gfBc}fVwD?C{xxJOa+mKZ)V<2WTgxp5Z<^KSe zkN7wrA|fj66&Ip`d8UUN|Av^!u9w9BvPlCbg$8i8Q&% z6P5E#;MN(53IlBjcP`QPcD;FRtX#va#}t;+CyM?b-QL@>#1U_A((_KamLQ9|R%txA zz{>)$hF#3WSLC<+6T`*l#~ujq8(GUT>DsN1kraBpvGYxap{9v-n>nXxUACEY&$U~C zf%1XXRDJ6G9r%ai{U5_V9=x9J<`ovY55w;h&d+e3YFqeQUABExZD$^I!q4p)EI0h4 z1xNtAHAO5PIlYp<+`muNp<=1GifL;m)xK?iTl79Z`1!9%CZninI&=c&>cdgjEX(}S zpj%ykR%G*L=VX3eylvR9obWIJ{&@cY;H|$1Z*D(lUl8inI(^Ok=7+C%Y36%-c_)@T zbE|3=?IgZN=2TdsC5|?QPC~B@{Tbiid_3_-h&6dni!|{u)~=d)OmfL}Kla>BG&jO1 zC1Vx4NpR>$+zhdmRV%g61@Qyn=Y%|Y4ep5AE~Bj2>&dCZC8XL#-`R$-;oFOgi_Io< zX%w}z!dte6WtRaOGvpDxS0!prx}K@GqSvmL+s@zChiy8Fl7i)G)^6+5*ZSQ505e@) z$)Mb?9tsXOMC!x5hMnQz zBb7&j=E>CUZPxSH+T9c+DCp9ho}`V$|7jMG`afwb7)Ht^~?$xy)VX|$;%(^6(T zu*~pB5qyl6O~sg!XrjG4w3WNR(DRqZmq{&t`y2YD^!vOjS=qeL8hDCl`H0Da<5wVl zKfC9yW8|FIi1h|PrlZs)l8ukluQ;DFB#rLTy~jmInuV~`iA^*Jb{+frU@{ECOe zA5=5OQp%PZHt89j-@!gL*HzaEo20h460Y13p_cOG0x`5YoH0zFgT5R1dfQIdw0nOw zrjx`zBfZzJ=LjJ$CXrmk@CY%&tfr*Ys$}{WwZmW5v{5jWEBr>(Hf^H>O zB&j4^YBLd>lBALbbHGuI91u}ackL#xrJv-#%%+oseSgT}X4Gz1#QrUWJ{I3m_)nyQ ztl%^)s98$Sw7Ck*s#J`0JPUrQJ-tHo(a8>u>dwM_4y2nNF8x-FhB?7 zKiyO+3;vz9;UI;{832qz48C>h2{$!vmD^}h*NT6lL!hTM5+E{EW2 zx4=xa&km~@XTo8LNa6>82u_@uD5XueQtjQV{zXYIWc=KJGg=GjZG2Ji+(ZV;&xXD} z(`QyYgp1+9BwBRNSRKp;rFcl`nSHC!d{wL6Pj77-HU-3bgsy&4b3ek1rIQ~g2XF_B zE_3qoa#31GNXc}(e<&R5S*!F<^F9!~)Mr>U0<77&wua1>a@!JJBS=;wBcXdp*?`94 zPI$&W``{(pLE@_$@VlmqSY-uSQfobc9{s(A6Y5#XO4Nv%$$u41{ow`I7n ziWZr%0kpi9C1W8Ag>abwSL)8O`#yLQ!ohXDW-Ff)Tw3b(mQzEi$o~Lmz0>?p8ZFh7 z@d+3R(rdlzfr1dG(YtUctuSzl!?fdd2&*oOexD?AVy7t9g{5wHuXndy&R4)+4}2rx z#=5Z6bS*JYhczuX!Vq1}Wem3y==y=OxY2{V4lb-Co;ZY!zwHYS<`KKISF!l_!Dh@WLby%9qmtB7TGNVAvR2#jW>b@M zi*D`O{{TK){%rii{iL$ONXEA@M|f2ZZ!2WN0V%yWp67RO8Lcq z)sHOy00LjMmw_yFuZn&*HrFlXTx%CszC%OuMlRJZnh~~Pl?^EafS?W(4gp1ZnCAJY zyX$B9#O}g3YLBj;l0I0QMT|=0&f!^r{lqQYl1Y#^IVYwEImU8HMHR<(zpv}D+LE$o F|JfK#>ahR- delta 20037 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 diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index 3ad2097ab8..0f582a6579 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -49,6 +49,7 @@ * - Fixed MassStorage demo not clearing the reset flag when a Mass Storage Reset is issued while not processing a command * - Fixed USB_Host_SendControlRequest() not re-suspending the USB bus when initial device ready-wait fails * - Fixed USB Pad regulator not being disabled on some AVR models when the USB_OPT_REG_DISABLED option is used + * - Fixed Host mode to Device mode UID change not causing a USB Disconnect event when a device was connected * * * \section Sec_ChangeLog090605 Version 090605 diff --git a/LUFA/ManPages/ConfiguringApps.txt b/LUFA/ManPages/ConfiguringApps.txt index bb6d185e42..fb9da70948 100644 --- a/LUFA/ManPages/ConfiguringApps.txt +++ b/LUFA/ManPages/ConfiguringApps.txt @@ -24,7 +24,9 @@ * - BOARD, the target board hardware * - F_CLOCK, the target raw master clock frequency, before any prescaling is performed * - F_CPU, the target AVR CPU master clock frequency, after any prescaling - * - CDEFS, the C preprocessor defines which configure the source code + * - CDEFS, the C preprocessor defines which configure options the source code + * - LUFA_PATH, the path to the LUFA library source code + * - LUFA_OPTS, the compile time LUFA options which configure the library features * * These values should be changed to reflect the build hardware. * @@ -63,12 +65,23 @@ * library components will occur. * * \section Sec_CDEFS The CDEFS Parameter + * Many applications have features which can be controlled by the defining of specially named preprocessor tokens at the point of compilation - for example, + * an application might use a compile time token to turn on or off optional or mutually exclusive portions of code. Preprocessor tokens can be + * defined here by listing each one with the -D command line switch, and each token can optionally be defined to a specific value. When defined in the + * project makefile, these behave as if they were defined in every source file via a normal preprocessor define statement. + * * Most applications will actually have multiple CDEF lines, which are concatenated together with the "+=" operator. This ensures that large * numbers of configuration options remain readable by splitting up groups of options into separate lines. * - * Normally, these options do not need to be altered to allow an application to compile and run correctly on a different board or AVR to the - * current configuration - if the options are incorrect, then the demo is most likely incompatible with the chosen USB AVR model and cannot be - * made to function through the altering of the makefile settings alone (or at all). Settings such as the USB mode (device, host or both), the USB - * interface speed (Low or Full speed) and other LUFA configuration options can be set here - refer to the library documentation for details on the - * configuration parameters. + * \section Sec_LUFA_PATH The LUFA_PATH Parameter + * As each LUFA program requires the LUFA library source code to compile correctly, the application must know where the LUFA library is located. This + * value specifies the path to the LUFA library base relative to the path of the project makefile. + * + * \section Sec_LUFA_OPTS The LUFA_OPTS Parameter + * This value is similar to the CDEFS parameter listed elsewhere -- indeed, it is simply a convenient place to group LUFA related tokens away from the + * application's compile time tokens. Normally, these options do not need to be altered to allow an application to compile and run correctly on a + * different board or AVR to the current configuration - if the options are incorrect, then the demo is most likely incompatible with the chosen USB AVR + * model and cannot be made to function through the altering of the makefile settings alone (or at all). Settings such as the USB mode (device, host or both), + * the USB interface speed (Low or Full speed) and other LUFA configuration options can be set here - see \ref Page_TokenSummary documentation for details + * on the available LUFA compile time configuration options. */ \ No newline at end of file diff --git a/LUFA/ManPages/FutureChanges.txt b/LUFA/ManPages/FutureChanges.txt index 1a2b7a031b..59a2790723 100644 --- a/LUFA/ManPages/FutureChanges.txt +++ b/LUFA/ManPages/FutureChanges.txt @@ -21,11 +21,11 @@ * - Add standardized descriptor names to device and host class driver structures * - Remove USE_NONSTANDARD_DESCRIPTOR_NAMES, make all typedefs unions to allow either naming scheme to be used * - Add in INTERRUPT_CONTROL_PIPE to use HSOFI to trigger calls to the host state machine - * - Remove FAST_STREAM_TRANSFERS as they have little effect * - Make Suspend host state suspend USB bus frames * - Add in Stream functions for PROGMEM, EEPROM -- move to templated system * - Debug mode for pipe/endpoint calls * - Test and document new FAST_STREAM_TRANSFERS compile time option + * - Demo hardware compatibility table/list * * Targeted for Future Releases: * - Remake AVRStudio project files