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 | 89 ++++++------------ .../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, 213 insertions(+), 95 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; } - - puts_P(PSTR("Printer Enumerated.\r\n")); + /* 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 delta 27994 zcmaFAfbrK|#tHe1KPDE0W-&1_GBPnTGBUvcg2nXzHiI)G0-z{^DJMw(KfoZ!!N|&R zWwSox3C8;W4EDb?7Bz68;KhIb#bz)psCRyOBYo$h-T8bK>~SAWryg6L{!KgA?Ajyl z?C#gEcdUJ|J@d}Oc~4UI?wyh#ta4_do71wN98R;nBdrzw_?d=GII}=trtUQEPjeW` zn)r+g586zy?rALw(c?@Kbx>BB6e46iq28PM;0um7uGQ*&bt3K$s+X5vJ+^(B#1uTNk9i1t0IdRi~iE>f?5^PfL! z*H3J$pTMB}j+4`;e@+9t&caWk6VchggI3-g!8dZvm5#70Nn_g${T6tT!~b^Dc6PX*SSQ_D{o1>_u!Rrma`Zs*F_ z=veQV3Yc1YiU%Ni{?ca>x z?oE?wuD`4|UG_FsZ{F&~Hn(3+K5kQ${^h9XOR4P*Dt#IIH=0Jz!oo+Ppxew$RcNafAI+?LJT3@Uv&*8`i4~t1f2!+9I~;rP=oIg2+2})@&CO zFzn1*w~Zq*ExOcgs;7!hx}qZkPeZoalFNJd{MrBT`s-DySyQjQ&Yk;be*M?nt#^Je zez5#dKi`kd9zQx4{P=h7wZra=#XBy))79fW-tsPedwSQST(yj+lkVwy2wZx@x4H3P zTw|TXkH!acs~`T`TK(|!*STLV7fp{UeN+A9^4ARhTgqGZHiiCFnVmjgnDtxG_` z>kEFQelULQ-nHe0X*AoFExKG!C3W7eldAvEaC(x7_Ey%lm!InRaZPjAY5m}oGV$B; z20NY~%XFpQJA8cK%HOeedBox^`}ehYP4sc9+@B`6?MuS7msY1NXNv2nDE212uGX|Z z>t|H0UR%9>+O+*oGDXklmrtMm@%^TkFLS@!@qKV_-V@5-xV2x1^T@2S$!l*MT=im2 z&F;C|wd;#b&z?G|DVJ^Kn75C|$rpLB zN9B&h{u%~;smBVN3ADwrOWYrae>p^q-+h zF~pjIFHD_*V@k*I$razfm40yVOq*$Ay7+GFz4*V2-i7$q>!_ZcwlzCf@yA=E1X?FL*7U&vrTYlYcaDem%^bfa6xCzNfl+giBX`?0Uld7s_8 zE^mFkBL7bFvYYOF%aSJ6KXFLdQ7BO^Xrr+q*YdOEcebA3cXdKF4nNYSaxswDsz&eQV!ed#SrSXX~Y(_3Eb< z%)S(JD`U;N@8Q?}Gt{3t&b#`DdFY0DFK$QO@lED^9Cf@-Z=>6hGl?W=YjHhoi`n=FzPUHt7z zbmT4V%(k1kiFzBT|{)cI)T*%yaxBu}YqmYz`f*wg3l$MLS-^2^J!UXylBe0n1BiNLE% z8bK?{6V^qfY)|g1lsG24etG!oUur(<)6@Sm@LqrZBT^b~zWLYB{}DQTFlncWFZ6ViB1d$1&+n!_rIGXa8tcd zl4;+O4@b9@J+llmNSh_vYZS4mW5SyN=WX>@q+^n+c?_OBowcu^7PwKJ6D)*wOUL<6?NWc-l$J z(3G-sPg(Se*jYZ!-oUl--ZFmfv*+I^pV_n5UU-(o9=D05OY>vD{rqOHZKq#%GM>$J z#`-6_Kln|NdSuD$$=Z{xIP(+Bj85^Vcbjj_pV(+`Ab-C6ZGHBC29~EErnQ%^s@Q+v zn)TaOPImuKqNMGti?;(#-qWA+xEBeRpKOu79=u_iCt*m_N@y_EyjI;#cn7bN@wlm05({nZ%kb?Xj-4__Li;?_n-Ucgc^N zc}ykNWfeXtE88}|-v3qo@3(IgmuhY3$*O+&{px>)!}AZ-ALGvTKeSJ8zSl3NyEKkYTy)~oyV`W2_* z{|v8=Sx;biVdSgIGO4Kk{0}Z|2h=7cYLimbkKgC3go0TS$1(ov>jSS82WyLJ{bx|r zsy}-9*}+qWX<;y|Do>vjG_PaKVK~y@cX5)xENkt`NBKAX zJudEJi}@39xhCuTJ=F_gr|Ly2vRu0)blcW@cNd!(#~z!cl`tFcZY1>ywSN-;qODw_bClKdX>!i z7Q89iU7lQdu>KAIHe5);?$@~8DP@w2aow{!>n-^%0$3=+gDzj=(yOz-i|q`<$6~R2!U4^mX-WS##Yx ze!2Vlhd<_o7CjI1U9~MgcFW!RvVRl*w#Ruce6?*-uhp|_Wz2TLRzj<8s33&?#QKH%bMANT)A~{R;eF86-1qfM zw(R;X_PXSA+4<)aQXGYh1zx0_JekISLW?mq-^t=u&|$A#-2r{;UY#{fZi|qbu$C+4 zl4N77Zi&@Q{c%F67rh31Jmp^GoT(!^i?=ROY?%%5+kNJ}`KgBg$JvK>#e*)Z{g`Rr>+SsPrpd3Z zhmT7uzcX0d*j{?(jk0u~Oqtf3-K!5ANz>XR)hmADi|_mOU;i_(eB1D&+`H`dm+jC0 zGw{{1*WH>-rec*y`Q0rx)^`2~SO#DI|KY&ri8#zQHvAneNIK0ap5lQoA>AmY=!Z zP%(U(dg0@SJt`oagwk0XJ zYFeuPbydH}In41ge|$gqO@A1j&lC63@XnE4$GRrR9WH)$qPtSM{+Q~Ht+R5(dQUet z80=xN@A&-im7d3;Z`GA0^>zCjjeO4)?cO$f?S9^0`={=n=i(UT%*64EKk)v<8<&FS z?cK@nvCsI6Os#dgY^L@C?~tZ0jRj0NFt^yb3wKIJ2kBwl zx~n`{&#pbR;Vw(dnuu37(%9c61~;u#72Bs$f2k_t%O7{i9kKU)^)3?S8@g-$Gi+PGKuCJ!TIbD%KWBd5$If`nxTpPROylQ&?3vpNU&u@D@#oH* zf8%=iuQU0T^{E=t*V1mve4HAzpiybt#ZPUaF}y8p|9bv2q`fWVZ(YOUvB;%K#`y$ew&}p)^}an-*0DH zf6&av`eStDwe>aWkK-k8d)Ah0zHvP3o^S7*2`5zJH_uiLIN(v={b|>RqV}f@pRfHf z|Jzlg`r+{5OBGd@zI_jEdmOj#qwMpZbtMU<*1KnK^UMo-a%W9I%%RuMo|y(2l;y@K z$geW5GTZscI(6FJGVPW~!@0K|ZZ}Cw1ewia_xSeb&UO8@KllS<^`1o^+d0kSfs&zu zqS>-TU9(SWcXIxFA;G()Z(sfKZ*`I(#UWd(x0jdizWYyou1slqs^;n!+u~xU|6%^z z_x<24`^JCDFQfV!Vi$J#Z+0$ca=M_gtGCNjMdQ-Md}g^wMnz|)!;;7N-(FmNr{c2H z2iI05k z(%zD@PU7K}KQlOruV|<=xEY`RcPq-X|6zUm`+eu?&S&ccoiuV|Ze(8kG%~X9ZRhU3 zg5?=OWV*Kdf#?CtB>Mu7CzvY_+xvy^!?bB@zyHndf-=4uzU!TCujb!bCjS|Jc<&KU zFD&aU=V(*kzME5}bzulQU$WlmCIQCJGRrPRHfDYO&(PsDPwL{+?0O?3!72J@*viCz zF4mCJ@u+9i-5T*{M_%?k3m#jqg4KDk!k1oWTfhHT?p(3*(3+L&EAQQUef!t8_D{$E zGq5`Ro%5z|akg&r&0ASkSC7qH^2#83iQ(-ny{m3=EVY>YuJ*&8lvXW99^QHz`)w+_ zLZ|nd#B*gn{CDx;TFr-hLbWa&f9@Bi>gIOrfkOWDthYgo=j%_ofBE{KftB&&(rp{p zXHLtVxn%nlp=S@AiVe)T@+PcK&WWg9x3ur+rvowbr_`(6-{QAv*ZpJq()W%QT<89F zk~Ka*QJ(r5_@;)PTqe$eqMXX^>>Ta)@w%p`nNZy zB2{F$q{YkIJwmn~ClCI~)UID~L}O7G11=okpLf&NcIWvO2i9L(|3j_(?dga2Z#KtY zG0B%bX}hnn)^OL>t1-T%`KijEZTv;j8_q0fKA@~U`M~;Uqa3edGC4 zpPDt=KV<(iH08aX{NldwyOT2?ZJm|PG0SF}$1P7I6-yOSYyJ-t%8DF*wttuXaPQiq zc;**Y&+2FEG(Oqj7OAN9QhH6sE7jW*-0n8Wx!d$zjo>~k7*`l`)_UvfAGOD(My+%* z_z|)t{Cak&eL_io$G2T#lRhn0X}V{q(xrUMYt^5d%vn!1))egS(z`hMa|M5oo$0GM zgRR#}_VaE!q5F27l&7NVBh_Y)4v*w5)9VZhKeMvS8~$8f|2sP9YKh0W{j1_#moMFt zuiG|nlk(lpP^T4h{oR`1)zBUaPqluA3V zI9_vbUc~yv^BlF#KG~_G!r1L$aeH#y>vc;W%?|M2?YUR%zP|m$r#kwZzyFMNoAo7b z@2|`s^KIkmF5F}LptpNz{q5{~k{?swKL6Hsw>oP3W%YUIedc*jb=v+(drPNWxVDl` z_r^A9X3yl2cd!23 z{%HD}?GFW&U+>fTSQC7Fxp6mlY|=MI*|l3LCrRW!$SjoImdx@dPSEnCb^Gj&d0M?v z6S{gH24=k35|wrJ>!tgbtRHikt_q$#x##7V^1EODGqi1M-|+9){w=*77az8%O}g)~ zdslGkbDa%tZK1)RmYm+f^zKFy*M_1UDx&rEOaIybiQKgL!;|lCO&pV&B2TSe_t<>KBcJI5=thZXuSL8N| z`K8`&)RSl7I4s=A{x*MA)<6CaQ>v`8$|u`?x@T3pDoK6o<=hbWXR#s)n|RNy+8Jg! zL5}I;S@(MJpm~A^Z^d+7kJq2P@5Hr=48KkD&c56C-j@HU|83)M3qKs2{E<6$?^RWE zVQK3pmvxj`m+Y98>A}0FcU4(_c>at=1?x)d{|qd9T-TjkThShU?JDoitLxw8{aLF0 zN$1n%Wd%F*xAZy4OzzwIK7MO_XK?(Fl`9vN&a$;q%-NAMWqN&q5!1=<`)cOQ^H6^` zC->*%^-)ikik?1q`Psbx49)-c8@=+6i+C&lDPGr%OJmViBYd4KuE04T+-<7(XCyTF z`)yeue9==yCRu&rNekvp{~7xIwBPmLi2fFT#Xh6IO=c^2%rweaqN6PCISrw_zm^3L^kxl%H_-ZLeBOH`cc9@a-kE_S!EI2^LE zZ0FpNvcid5{%6|G@0u1#D_lHzjXpk(kIeO-1WTAEtvjx8)wo5nfeV0qPp+jrQv1@3L0RD1|xFEXh{ERc38=pxsFl-V&ps?Ym<1G<^I@ceIAI55XRjmEWeKYD@TFQ=T zFOztm?r>m|ILB8haqR9M0Y0-ezWjG~tXQ@-Z~BYf`ae>%L>E1K^5k;;+w%N#_dobg zu;a*-BoGkj}o1e=fF7Be!t8)3y!>Ewh<*c)x-YM*1uotz@ z&%d?pmN&m}_T;z?5pUxT`)rFWc#=2Cs3Y0>n%kU7M?SbXKVvdY{PzBji14?*56=(# zv(zWNnEvth?c@1cCzN)urlhJGoTy*>y;I0gaTAy9A0GK9=8xYWi}imrZO?(2-5J-4 zPhD_}uGl%hnr-J~n(o0^`4w-*X0!g!@b$bcyKLsEr5ypB>J98F8y`9_6nQE)#$Ei7{H^B4){p-g zj$E53`XlShWQvR!7ritsPx;TV{$-x_ zmsbV#ay%clEq<&o^x~hyC0+G>SGTTpyY0Ja^L9@;&$OKrlVeu#o|gEzecs`ol?we| zg8wr#+14L4E0J%J=PY@xo9vOiCcDYj{OGOb{|v{ERQ0V*%`Z({d03I#->CQdeOMBwwqfs< zE%kN}x5vetUg5p`P@18Z`*ZWDQ_G6~?)rE3KLc-0jqJm}+Fn=RCiTAk_Q&w!Zq`0a zg)3j~YuR&D%rNQR!M(b2?Vg=&mnPjkX27-6wnVeq(rRn+q94H*f9|cm@BQtj%+)2g zp0vDsy8FepO_zPYUw5rf{v>@Qe#7ZMaz8fKe-!q<XLOfuDfyni-R6g$>6cSe=j+L?jg6>m4entnc*3}aRY7jyRO$0; z-RifotzOywedYEw@p=1}FZNoilPW4T%hv9%nSFxl-$j2UlOJ9!tY5y_YkjBEHP zZYw6p`K<|9ad+BD1)e_#{ssTLb${#h#*$vX&%x89H@a?V%VfLV(LduMw@`9l{`8hO zbLQ{YGfpahihu03`L{=n!R2>4CAUwn{?DLuVuFA5^ZGB15{uiW|BEsf+_8fza+A?* zvHg7i?0$5AYx~iw-m&D9x9gGBk`o@xF>q&)pTe^$ zt!S+{pMSdg;{B&n|D`yybD3IBdG|f8>ifU7KR?~y7XCJJRZaQFwRfUYuO6x>I#n5_ zlrly4b*Hqd=xsHI`hy)RlOj*P{v3Yzys{amWfI?`%7d1?Jzq{7w0rVc@~D#X##@ZX z-5$SN=V&8eWG}=XWOS*AA!!Zc3l9Y$w}(yc-#zTtCQX~R_t($e@9uy7p=**q^Yx}1 zxi}|s7YI2pt9+3?`9*Ho^vsjr>fbjpS~B!ZJRW#m{#3(_{Gb0B>?f`+3%hhL#x*xz z_)d(k(s3R^l}X+vJx)ss-KB)ydD>JLIlO)^&rqKh-#vfJ^e){!rXQ{!HlNj#Yo+>c zt4Ywo#hHc1ES2xp&*XZ?F0Yg~v7c)>yZjCJKf?C^IJ_UsXL&u#yw^_sWw^Y+AE$cW zxkuN0zg2fvNc%u?>eh>EQ+4zhPp|#Yz}NoB|BvwQe;o5a-v74tdP%)ljpHS~J**#AK99T>ef3l6+o~%fGiFCe zZu~nxNiis{k|ULmNu}q9|2yVye*YPo>T1+~$k#8u@k9L~d#i~&--~@xTeiw6f82U( zcD~7`I|;0F)g~ETpVd7znI-SMR9obd&z!CNFTz{@@n*&eT;B4Y`A59(rp-I{?eNv| z%uVjH@Q!rI+iLRpL8{m+vH2-W*TqZ~I&+#)DROG+FJ-spgZ8{7cjeqVPU(G}YwY*o zZ_m=j*>lsw>L<9TKe}5danO*v`(rNe0&vxUdUwB+ z*S;w{x7G8muF|g3m*vlY)_gzy!~KJjJxA8Aw)yL&@47pGT)HGG<@0@&%=%@qcNX`G zy?Xk6TC7v$rJOWVL+*~*r``POTIZcKiC%iubV>i4>CbLIynocRUSeD4zDr^JTooTG zH%;BzUwd|uujQd5`rQk;v)<|HcfQF}*fJ@RZ((}vI`?I-bvXko(yr*tdt|xHrRcQL zdEqFQpEG?QP5i7b`)zk}u7bGKoWT2;R=u+;+>gGx9c8^%J^1gr>1#H%bBLzx>hV=S zqtqTS^OM+}4PAe(_x@TpFD$!$?XTO*w#l;1H{SNQp10)9`s*$y-%Nj77QQQQkKM)6 zbe<~yF4@I`+^?Ob=NccGIJL&5U$}kZ2b<}}2`jdp{F(i2!iTb@)eGGpuhzKt{K$U3 zXTI7;U#;4>ZS%v-f3?O(7?USTV}7jo9=1Uzksi@;aHl#_N04`lh+{ zHnxu}pN3VIo@c$=a7(^R??^}8g~SH79R)FMTdx>7)NZ|!{Vm}3k-Yr3m%jUK-MsVS z9`|gOw5R%iq*tkIG`Sx5Mpyl&*KRL{^opdN7Jpw|3z)Oe;!5*X>-7igG;iIV_2%qS zmg_2um+W8v!*1p6;*ZKlX7x;eCSJ6ragIr@!spQX6Qw7DJX4IsPI55b5D}=fH~8`E z5W9KMv`!_qbR}oWB&JO>wrx1nHnrh^<>BTFZ`ZH;&yaDRAqBWb$TmuG;fqC13Sw- zVQ=(BiD}w1|E!*=|3+fh!zbR}-3qV7?O*Emo>(rwN`7nE!sTan)wf91rKMCd9OMyc z^7l#BIlzP>4L zAMUL`Y+$K3{w)4&=Kp$z zrnEm+e;0gNeyJw>VXVI2N0ZxYx2%_{sQ2G~IqkEmXZpo=4<<>3nC?AvdTE_?a@lihm%8G5(fj8wTYW&O=NXBJIuWNDuB z{hZ^;=X1Ust&+u#IOJQ?$ElbG*wnqFceLw!# ze&Btv;H1Jsr=ER}oV1=a@wBk!Fivu3nZ#z~;rl*szJa9dj>+FM7}HW&oqL}b%h)mG zF|a&V=wp<8=6_B9hx+wD!r@2jx3cX`ebg`Uvb_G6`QeUb{1OvYoBRb?k_z)K9gE03 zb#cNaeIeOLwufx5zL@{PJO77z-^$&;FT z(iG%4l9--1q5il;$J>#%!O*~Db-(Jv)_VQs}Uhb)!u3S8&fO!M& z=3n9;{xdY2yyv?edpKv>EEOr&Ik}Hw3xy2xALbgLisYNPJSV8VK5UX{SdCf8-1j?Y zsjQ0U{Ue$C;kiS5+}2CFmyg=1PkDJy;_`#mn2cQ+Li=y|^c73*wmCB|lh^o;%-li)z$SbpR?U=rQX?o{nJ5~?|J@rH-?;?bY->uBm4HHdoGsxnq5CVKk}lD zz1hlT8@Z>=KRByx@*{cP7?+!&o4(!aay7zGMkvakM$&&KEJFe{EU%PRV z|Ch7s5nD7D+!qgG?p!DBC26y9Li)2?%wDg;zt0Z;&(Qq6@~e{XJzJ&uKkE;?+_(Gf ziR?>v{xf8sFI~KP>Asz*3o6$8988#3`YZZ=X1HqoahHGBF1sW!v}`>X{Mms0MSS}_ z?M)xwwcBm_WPDR>=Z9l^7vE(M%;r$jPAuA#z!{oWu~f^;=+viz;(oagrCYb&o!;_g z_Of_uugS;b`Bih~TinSg?saw)6#u#B$CuTX91s2+nP3;1_+HBDWmVeD@AdBuslNV=6zopV-p;F)Zf&0WY=E}1N zlV)u(xV@+Ry4UuAn@4V`?VGGpH2XaNE9+3bywJ_h+X>Ki-m zExR{e(_h@>-FFgl_23spI@{du^)DPi^3(K}l`W*ZrwD;<@31UXyt+qGn zpX%Ogrmoua-AtSRl-Wl8rMEVoKId9*_@6leNS4_=M-96twyddn{H|vsw4?C=bTUMz{?A`ij z-K>|j-!9&*+HvJu*_6d8U;Z;_+ikmfyELti?X^9RX+6JW_Vte@LMCP@TTh1M{9Ss7 zrQ^hcKdbp3_qnCo7G!_3|HrBMp-;a3+pQ<&fyYIcAMy1+`cHDNQ@2ck@9NBn-i!Pm zI5B%{x8wG%m|5BLN@u~k2jWvdxF3AYEBxCd&UJZgoM*Z2o$qDe#V+4Eadf)0YU|7t zMzfD|ZzSwEsJP#&zK->W_&-5;hODGZw@>f&wbSpAvSzqwu;W8|$HS|7$-Q^x-t3Ov z9(&-=YvBoQWorWu>k=cOtfTnB?k3HilWWJZU&Ee^SntTJ@m%YrSXpXx$TU zciXo0V{VV&MBWyuy$=O{%)7Zk>YlatkDO-{)K4?T#-1?z)ci~Lqx}&%{`QCb-8GS` zUad}ksB8UCsAca}z3tMq)*e@L#E*(yudZ5uGo{PB_T-K=y^7LZ4Es6iPR0w>N!G+~ z|LETFPwv&VdpeshzFVL3{;_v2H?$-e05s z@OHhf{v*Aa3-4vmvRk?Q_HmY|t8drtjz7Qnu6Lf<@k*s57gu>sD3{lq<`A}j<^A3& zjZGi6+>`!%_UzilF9mPKd)+r%`e3iqCry*?{|uH>-tFG%T$pII?vYqR%Bcs}V*fK7 zmbE`}pL?r4|EpWMdr#kuymzpCSSrXpRR>t-4Iyk#0+(lj$^zp|rI zBCkKYuC~s2yY@fB`s4nwicukt#jBUS`E9!FU)1J5ou<<2oA&P5I<;nb>n!umt1T-& zPIn7h=Vq6Z0UAIz8#&JoH5(`O11q`@+RvZQZ6$dGucLb^VT9kw70uSCIflSCIg=T}L-^T1dok919GYx8^uYYDDvi zpKOo98EPwki~l=cZoh^9SUzt>RJC;b1?9b)_FjM5;=y!d?GX=!Nv@jpPp409+NjD9 z^jz_r|7pW$ovwvS0Zcmz_)oo^GmXoErS*95oD~)d6YST<|4^L&=H|ll532d4UWM_i zzVF(awr5_t#JQXi8#T;pwtskkcvt$3FS1I~)n(gv?cB0;_pP>!@WcPO-L7nXeOy91t~OD5 zTT(rD)32a9OOSP)2;R=A{0#!~T6L z5_e4A?$^-EzO!k$T#ko~Jrb)U;cP>NkQGuHdi12bM5@QPgmoPbd>hItlx_&OLMMxE;}%^L|MZ_uUHnBj3(5PV;^6P~pmh4Kt=oyML>G%e^D- zgLd$W^UH7FS-tk`zxHMKGp-*pO`G^tzrAXY)U?S(WkOMpvPD{i%7t{f>!&GZU;APk z^2$!|x9zFvlf5={=3NRpb6rmS`r<@k4+*x)x9=9+3b)WtRBB>olechQclX6T>&shi zH$OYP`o6d7VKyV3>$hrGR}_aPrT8v4+cmAT$Xow?>eL%GGt#bU-F~-!{oMZyLDKh6 zo&WW-j{D4)v%+Cr_QJ1Dv#d+r{$uCD`qvk?!V&+)CYTeI{yKHeU%kW-IM0c(CBo@#R@v+{)gHZD!@u!c^)`{t&wUm-+B7 zOU-AI_x=Qa$UUgQ+L~KB`*g3$1W&=~mnCDTGxR=JXXfqym}VC7`1+|;yI;)X_~Q$cLIb(TpvBvyT6cKDw>=*1@N@U&V#DoAL&h{Pe3|(q1}! z{!+)ZcjdkN(k?7BHT@Pgx0G-BL-##9xWCP1kGLG~tVaY~0XR&zmjv!h3m-Yhj_?!iQ_k13r1J)Ytyckn+k( z^z>8-Bmd&9fr6|hho)Ky)l7Wq?`tbQxqkn%RIRUCtIvM^RQ~n%ulFzNs$Tu_*(dm8 z`osIocU`96TDEFd-Ez~tTYlwij@kR4;a7;k>GD+GJ#Oipf#sXDE3-cv3oWTzP-FIC zNtNoknQMP^{moC=_qpU`$?ND!zNz{7E2Dff#Tu7KpIVxKbJ0$occKctIW-4-CdGK_ zKcC-GQ!lu*M)Swy>W}-6i?3c(;eX&hk4bLOvu{7oeB1oWT>h4P&a7LKUX`01mqcW~ zP_(@NZ7G9>h5Us1vi}(#Y@EME|JdB{qjFq-XVj?J$^CG9b}v>;zN6~t#H)3xuMK=x z#J{wfaQR(c0h$uqUZkcEus`E7xq&ZYOMQ3zruIYm9f3b)eUAA!ZRNUG-)HsS zyqdP_%934I^in*Zi02nPyfM8=`=qIbo^rt1r)M@>{j6aB<@7`Rq3ehKww$jUg*(*l zFFl=WvRJ$-_d%rY7w?%Tr7w8AHJe&KRa>Pus~|ni@}b)6Qxcs)-)cISmY1j3XK&y7 zK7ab7IJG$$K_!drGD9-=u6=psi+tZM5izN<`6~`*3p=N-s?W%raA#R^tI9mh8vlpc z4-VU>{|pc4GM;ehhT4UiHFEh!Hm{qzDC@e5N6FQuL(hXVE_tk5vt?#zuy5_lfm)x+~YF)T!+1yXDC?ztTd-rM$`8 z^3A$N)|s6?xk7Ba7kQQbXJC2xYwnuDyXQrFUVr1<)7~GlZPFFqV#ld!x7O*cnVI+S zAlIZ#e_x1YJo&O_c3IWQ*m{qL-=|s>>#Z$)v;V<=hA8>t<$uJaAJ}dGxc#44SbyRo zms|fCT9WGLAKB()p`i9UU~8ABYIIOarc7+qY73ujaTV>BC;#c|B^k!}iXC&7-ZZu5 z9jp79y1aq{kMl`Z*MGU!6kK?d`s3v4NRtnDUQE7m^QGB!^F)4w1 zdE&xKX(9PHPm*e0N|%4A{9X4)=s!a%=kL%zfgf1Pj5BXV)xQ>c9VNQE;nl9N4ex73 z0)39;d%Tl-rm7n9rZwWpx()QS{XcjxiD=H63xN=_UzoIJTFrTpYMr8U#<1&7^%t*-i}&+)?C>fg>K zFU-1ky^q+x^|EgL4WWzD-6tpA(w}2*m^b5-r4~2y)RX@iT-N_ki$A#Ap0P&q!@B9I zS!F-cof>`~6773%>*cK+vFk>j(hp(aJFwOhIteL)dR?Xbg{~o>$){xNc}zIo&O9eP3PQdWOV;C@HkDV zyK+sqZ1%dFPEOr#{SWUG*~+l~y>7jrZt8q#RSCv*@0lBxGH$z5*5q8Fe~8$3AUBJ4zQSz8S`=x0sO}<^N%l^;c`JX}gRCmoui<|!$ z>JO_`E^Fu)KhobBXS8G2u6UlTe~K6F1Y=(qGJN}fZJU+bOv!5xI~S?hdfkt^x>aM( z#U0WWsj-Wk`sEkBE{r|<@bq6Bll3bz7S(fRJqrtb{$l$??H5%OKQa6c_-!(6jXY16 zUTWAe4!Oz?Km03~{xEv=PW{u?-tc4hMb|&oF}K)Rzi&sanWf>JU2}^rwmqJp%fQ0G zT7GiXjIX_F&pu@v&C|V<_~F}D!3l03@1B`n)!w#V#dX3X^NRHeF`lzezEw&&V^1_6^5VGhTR$5d-K{$4S2?bd4P zUW3QYEx%)@i0e<359_lZv8nfz*|lwcwb+b_wfla1XW!L6mvHUdKcx>}uH7^H zFvXamU1-_D%vzNe0jFqDF2|!)>djwQ>qc45Q`KJlnv-o|uE?r`=ei%ywUk_((bT-r zG_^OT`1k2fqr#nGm%=k&R+~QmTbGvqu-iZ1fB$Fs?3HS>AKe#Qig%~BH&7-TF8>+P2uY|M0(J7gLTsg%4h;`tg|knmgyZ zn9d6E_pZ|G#AOM!Mzy9AP*>~~}|IM_0(!%=NZ{>%>ab4Q)CmQ~~=4~m# zJaOv_i@^>6*( z7?rmcx2x;Ae*gT>5GBLkxOIi;e%|Qm_p@sJ7rl&nb>xTthJCBk(|NX?eVVSBx&DUB zxqyeW9%yidKe>L%rB?@tHGj2#pqzn<ZBO-8y#5TFkI<>$|NAkN*akKKsY{x1&z(2h+C`?un9<-c&5Q<~GfOuk=3m9an7+ zr3k;=t+ss9C-s!m0_6Q$AB0XhtupW9LvNKmJFnL%)^?mV+rRGhb;CQpI!jEf@;kmJ zXR2f?u)pOg@imyvJ5yyRv!ciG`rQ?WKEJI~xSTH7@A@aRtk1K6 z!!GsT${IGeOOEf`WLEQY+Ghu9UMai!I^$)^zVM&-*DX(8Z`tQS`f}~8`)B{2 ztda{Z|4@HON_FYfbM2Y3tNpwj3q%!X@w&w-e!b8CszrYCSta&ObDbKC^e3vhd4$$y zZ@Off-5c+)=|V2Uwx)O2w7WCb-t64c_wSbX?T9JLHLJ59d2`QDObbgyH|8`dwVtse{M-KY@cj%{^)-OS$DR{`MFCB zn$LHB`SANx<;1MOqf6o)C0(r-O^AP4{De)@cGFI-wQVgwWtQFDS^uC?`sS4$MbZ6V zf6V8vak(sg6h|z!$f<|&v>tXyVUk=_nqBI)`zq8ew1r>0m!J3lk+-hrEMF}-$-T?e z!&6$k?3v>h!HFk%LYNqH9;9|Ymz;X(^{vonQ&-%3x&6XP)_b!{O?%JoUUckZOl19u zgn8m_%B*R<2T!~**qc2k!BOG!eY<@>-+z^qYq>t(ciG(W@u0a~VJ zzfAsz;`f7@dptkNAC(t)mm~GCWa+kxCEvN{o_i4cDuDBelfcPzW;Y2w9_I}HE&N~D zeyBf;tTBA}S15YMVaJE(*WwzK4`&FlGWvJs`^`4V+|D@n)MDl~`+Yp@KBZ45JUzT?+O^o- zng8Oi_QllKybm*YvA1TDt^dPqb4uj-YV0mcF#MDJ;Vk?2@Wjuy{}%JkFxsv8EWBd< z$rCKom06m*_L*Hx-*~AeQg!o;=NI z%edE{fBt9i`LeYAO}TlLZ-;j7!~YDN6~PA!TxKMc>c*Sz>PgO!j)`zxvdxY2v!?|Y zZ-JcpM}h5Eze;B;{Q330Nd30f#V58KF23RYpr8BxYq9Go0xVg(?oBS4VWU51Y3I+4 zFK+Q|T%LK$<)6}(L;XKI{71yz|??3ZT z-%~vDQc79;)))KvZGs=`riz@2lJ!3JPx0b^hK+elUq46j${%@oxsvO~? ziQBd0-)p1tX@Bh>?)%Gk`Pi=|Rc$Lj{AY+)Ip*J0B3q&KZerJuc8{wzhE+%03?{7o zdiB^hJx?Kfxd_!g{YT@Z!?#ZQ!h#hgkJizWw~t+p|8x&0_(@!lOfRm3!| zt#ac(8+)yPrF;3e%B5|Z;;!>U1zq}|Mc?{6ul~FLwUQgmG7{HJ`a%`>r*<=VsLQH% zZ8>t)PGWYiZ5a3J_rev6Zg{oq_DI=sRZrx}r11QkQ>O^{i7Q%9*D9NodowqG`rXg} z84P;8U61PKufCji{p*j#r%ZG+*Okm%pU0A0x@7CN<)5a-e$EU!SYNyB)}kFu(cLLm z-)`c(wT8i>-ojSCDdtvIc$D-BA&K`jo)33NFH4wdyy?g0!{%H^R%vOUubJ3j)_R$N zWr6gb{|tvOOC_6Fz52(0MP6E;8);zHdOh6BEzJJ4 zeqHdK$2-hF`9J(EefqfTu8WU0RR2s-T{P+UA*=o0!Zz1VU_Pd@xj$fH5nHmBL*krb zJM&BL^mX2^S>s*1?c3q#OJC}Ls@f}MO=7P-znA3Qr0An2i(F94y)tDua>+Q z$P~JFT+%9UcmC4sYp+$(Y+l-#Uka0MIsL}^=oRTZa=lgJO@5}mSC&lrw|_O4*T?Rw zD_;C(;QwL2VxQQi?OXO=-Lf;OkEQweKdVc5%t~%G>*dz$GrzoSyLOZAp1*~QV(YsO z)K0woe$lMEQ}(4A=PL1o#S7Eg zqT_`tx-Q+jEAY_dzEFl$>z;te3di}swchGUZMI#;aHlIX>dW=K_}BjPi+$+;S=P*3r-<3;D->7d zG-R6>w)Us&)7rkTH}Vnd+C9+^BG(;hLp(FV3^zTa@MpN%NsvUtAFy%%E|xp+Y3V10>Avptv{T6dY^K99B;al;P&YzyN>QX z=k;^q#`v~-`j;akKP}OjK2f3Q0H=ZEw|8zb@ki$>zmenoaBXq9`YgW1*>cYf`zNlm zv90DlX|l#?N4x*zXDpfu?-&~Ao|nFNwDj>^g~dNFM85jusA8z85&6YmdP>jadiAqg zmpkp(6Jb5nS7?9yu3dG0QXP=yYsC;_i=^c-Y4Y$V?9NhMJnQz+F z#~ronf60ctm%I>r>rcPX5A{Xeq92d#Ennqja{WWdKlRHcr#+(#)jMniF2+}0H*z?- zFXQO0gyjlve}3Tjz~8e^zTfkb$$6pw3`ySgW>X*6rU!pCTe$RG>+{VM;_klur_r3r zb7{v0v&kI)>P@2hHTVsktHTe`*V?fU)Je}=m6 z_UBIj<7)qHANz;r@A5xcIcp<+cpo?77yFU+&0bdik#MZ=V@toPGuANP+T96m1lNWs|_1LrM3TOQpGX0M?J!Pn5dcd0YxM<@oPU(g_ zMozzlZ^&`V`8<5H+Dq1|%5J{y`X}XXao47(Ue&fY+p_wDmj*m^O(()unr z%a2@IkL}Yg>utTi+2i(%Nj^+W<|#aV4%XRM4?EvXe0lh1(0;%9AMDri>kHateV!iu z=g<1Tb<0;quPU2nGg)=5>>&Nt@0KXw0upLJ}{k3=eNoqc$p zbZ<*p{j|kiAMWHymUTSpHT4%fy>m)Wuc_|LbB0q6&*QCR|JHL)d)r5~-He*GAFYpU zl$BC<3(oxT`#_<@o0J5>vRfWCFU6l7n0-WxBd6)E_|e>eUaeD~9y!ZwvlIKM-f3Dr z>D}bRD=Su*O)Xz( zf9_rU*k4Fx&%0A|*<YJXI(C)wOM-%Ie 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 delta 20037 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

rbo*I_z~}PJYI=x7n^LlVUdR%ClORx^~@~y5)y0 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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