Contiki 2.6

usb_drv.h

Go to the documentation of this file.
00001 /* This file has been prepared for Doxygen automatic documentation generation.*/
00002 /*! \file *********************************************************************
00003  *
00004  * \brief
00005  *      This file contains the USB driver routines.
00006  *
00007  * \addtogroup usbstick
00008  *
00009  * \author
00010  *      Atmel Corporation: http://www.atmel.com \n
00011  *      Support email: avr@atmel.com
00012  *
00013  ******************************************************************************/
00014 /* Copyright (c) 2008  ATMEL Corporation
00015    All rights reserved.
00016 
00017    Redistribution and use in source and binary forms, with or without
00018    modification, are permitted provided that the following conditions are met:
00019 
00020    * Redistributions of source code must retain the above copyright
00021      notice, this list of conditions and the following disclaimer.
00022    * Redistributions in binary form must reproduce the above copyright
00023      notice, this list of conditions and the following disclaimer in
00024      the documentation and/or other materials provided with the
00025      distribution.
00026    * Neither the name of the copyright holders nor the names of
00027      contributors may be used to endorse or promote products derived
00028      from this software without specific prior written permission.
00029 
00030   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00031   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00032   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00033   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00034   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00035   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00036   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00037   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00038   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00039   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00040   POSSIBILITY OF SUCH DAMAGE.
00041 */
00042 
00043 #ifndef _USB_DRV_H_
00044 #define _USB_DRV_H_
00045 
00046 #include "compiler.h"
00047 
00048 /**
00049   * \addtogroup usbdriver
00050   * @{
00051   */
00052 
00053 //_____ I N C L U D E S ____________________________________________________
00054 
00055 
00056 typedef enum endpoint_parameter{ep_num, ep_type, ep_direction, ep_size, ep_bank, nyet_status} t_endpoint_parameter;
00057 
00058 
00059 //_____ M A C R O S ________________________________________________________
00060 
00061 #define MAX_EP_NB             7
00062 
00063 #define EP_CONTROL            0
00064 #define EP_1                  1
00065 #define EP_2                  2
00066 #define EP_3                  3
00067 #define EP_4                  4
00068 #define EP_5                  5
00069 #define EP_6                  6
00070 #define EP_7                  7
00071 
00072 #define PIPE_CONTROL          0
00073 #define PIPE_0                0
00074 #define PIPE_1                1
00075 #define PIPE_2                2
00076 #define PIPE_3                3
00077 #define PIPE_4                4
00078 #define PIPE_5                5
00079 #define PIPE_6                6
00080 #define PIPE_7                7
00081 
00082 // USB EndPoint
00083 #define MSK_EP_DIR            0x7F
00084 #define MSK_UADD              0x7F
00085 #define MSK_EPTYPE            0xC0
00086 #define MSK_EPSIZE            0x70
00087 #define MSK_EPBK              0x0C
00088 #define MSK_DTSEQ             0x0C
00089 #define MSK_NBUSYBK           0x03
00090 #define MSK_CURRBK            0x03
00091 #define MSK_DAT               0xFF  // UEDATX
00092 #define MSK_BYCTH             0x07  // UEBCHX
00093 #define MSK_BYCTL             0xFF  // UEBCLX
00094 #define MSK_EPINT             0x7F  // UEINT
00095 #define MSK_HADDR             0xFF  // UHADDR
00096 
00097 // USB Pipe
00098 #define MSK_PNUM              0x07  // UPNUM
00099 #define MSK_PRST              0x7F  // UPRST
00100 #define MSK_PTYPE             0xC0  // UPCFG0X
00101 #define MSK_PTOKEN            0x30
00102 #define MSK_PEPNUM            0x0F
00103 #define MSK_PSIZE             0x70  // UPCFG1X
00104 #define MSK_PBK               0x0C
00105 
00106 #define MSK_NBUSYBK           0x03
00107 
00108 #define MSK_ERROR             0x1F
00109 
00110 #define MSK_PTYPE             0xC0  // UPCFG0X
00111 #define MSK_PTOKEN            0x30
00112 #define MSK_TOKEN_SETUP       0x30
00113 #define MSK_TOKEN_IN          0x10
00114 #define MSK_TOKEN_OUT         0x20
00115 #define MSK_PEPNUM            0x0F
00116 
00117 #define MSK_PSIZE             0x70  // UPCFG1X
00118 #define MSK_PBK               0x0C
00119 
00120 
00121 // Parameters for endpoint configuration
00122 // These define are the values used to enable and configure an endpoint.
00123 #define TYPE_CONTROL             0
00124 #define TYPE_ISOCHRONOUS         1
00125 #define TYPE_BULK                2
00126 #define TYPE_INTERRUPT           3
00127  //typedef enum ep_type {TYPE_CONTROL, TYPE_BULK, TYPE_ISOCHRONOUS, TYPE_INTERRUPT} e_ep_type;
00128 
00129 #define DIRECTION_OUT            0
00130 #define DIRECTION_IN             1
00131  //typedef enum ep_dir {DIRECTION_OUT, DIRECTION_IN} e_ep_dir;
00132 
00133 #define SIZE_8                   0
00134 #define SIZE_16                  1
00135 #define SIZE_32                  2
00136 #define SIZE_64                  3
00137 #define SIZE_128                 4
00138 #define SIZE_256                 5
00139 #define SIZE_512                 6
00140 #define SIZE_1024                7
00141  //typedef enum ep_size {SIZE_8,   SIZE_16,  SIZE_32,  SIZE_64,
00142  //                      SIZE_128, SIZE_256, SIZE_512, SIZE_1024} e_ep_size;
00143 
00144 #define ONE_BANK                 0
00145 #define TWO_BANKS                1
00146  //typedef enum ep_bank {ONE_BANK, TWO_BANKS} e_ep_bank;
00147 
00148 #define NYET_ENABLED             0
00149 #define NYET_DISABLED            1
00150  //typedef enum ep_nyet {NYET_DISABLED, NYET_ENABLED} e_ep_nyet;
00151 
00152 #define TOKEN_SETUP              0
00153 #define TOKEN_IN                 1
00154 #define TOKEN_OUT                2
00155 
00156 #define Is_ep_addr_in(x)         (  (x&0x80)?   TRUE : FALSE)
00157 
00158 
00159 //! @ingroup usbdriver
00160 //! @defgroup Endpoints_configuration Configuration macros for endpoints
00161 //! List of the standard macro used to configure pipes and endpoints
00162 //! @{
00163 #define Usb_build_ep_config0(type, dir, nyet)     ((type<<6) /*| (nyet<<1)*/ | (dir))
00164 #define Usb_build_ep_config1(size, bank     )     ((size<<4) | (bank<<2)        )
00165 #define usb_configure_endpoint(num, type, dir, size, bank, nyet)             \
00166                                     ( Usb_select_endpoint(num),              \
00167                                       usb_config_ep(Usb_build_ep_config0(type, dir, nyet),\
00168                                                     Usb_build_ep_config1(size, bank)    ))
00169 
00170 #define Host_build_pipe_config0(type, token, ep_num)     ((type<<6) | (token<<4) | (ep_num))
00171 #define Host_build_pipe_config1(size, bank     )         ((size<<4) | (bank<<2)        )
00172 #define host_configure_pipe(num, type, token,ep_num, size, bank, freq)             \
00173                                     ( Host_select_pipe(num),              \
00174                                       Host_set_interrupt_frequency(freq), \
00175                                       host_config_pipe(Host_build_pipe_config0(type, token, ep_num),\
00176                                                        Host_build_pipe_config1(size, bank)    ))
00177 //! @}
00178 
00179 //! @ingroup usbdriver
00180 //! @defgroup USB_regulator USB Pads Regulator drivers
00181 //! Turns ON/OFF USB pads regulator
00182 //! @{
00183    //! Enable internal USB pads regulator
00184 #define Usb_enable_regulator()          (UHWCON |= (1<<UVREGE))
00185    //! Disable internal USB pads regulator
00186 #define Usb_disable_regulator()         (UHWCON &= ~(1<<UVREGE))
00187    //! Check regulator enable bit
00188 #define Is_usb_regulator_enabled()      ((UHWCON &  (1<<UVREGE))  ? TRUE : FALSE)
00189 //! @}
00190 
00191 //! @ingroup usbdriver
00192 //! @defgroup gen_usb USB common management drivers
00193 //! These macros manage the USB controller
00194 //! @{
00195    //! Enable external UID pin
00196 #define Usb_enable_uid_pin()            (UHWCON |= (1<<UIDE))
00197    //! Disable external UID pin
00198 #define Usb_disable_uid_pin()           (UHWCON &= ~(1<<UIDE))
00199    //! Disable external UID pin and force device mode
00200 #define Usb_force_device_mode()         (Usb_disable_uid_pin(), UHWCON |= (1<<UIMOD))
00201    //! Disable external UID pin and force host mode
00202 #define Usb_force_host_mode()           (Usb_disable_uid_pin(), UHWCON &= ~(1<<UIMOD))
00203    //! Enable external UVCON pin
00204 #define Usb_enable_uvcon_pin()          (UHWCON |= (1<<UVCONE))
00205    //! Enable external UVCON pin
00206 #define Usb_disable_uvcon_pin()         (UHWCON &= ~(1<<UVCONE))
00207    //! Use device full speed mode (default mode)
00208 #define Usb_full_speed_mode()           (UDCON &= ~(1<<LSM))
00209    //! For device mode, force low speed mode
00210 #define Usb_low_speed_mode()            (UDCON |= (1<<LSM))
00211 
00212    //! Enable both USB interface and Vbus pad
00213 #define Usb_enable()                  (USBCON |= ((1<<USBE) | (1<<OTGPADE)))
00214    //! Disable both USB interface and Vbus pad
00215 #define Usb_disable()                 (USBCON &= ~((1<<USBE) | (1<<OTGPADE)))
00216 #define Is_usb_enabled()              ((USBCON  &   (1<<USBE))   ? TRUE : FALSE)
00217 
00218    //! Enable VBUS pad
00219 #define Usb_enable_vbus_pad()         (USBCON |= (1<<OTGPADE))
00220    //! Disable VBUS pad
00221 #define Usb_disable_vbus_pad()        (USBCON &= ~(1<<OTGPADE))
00222 
00223 #define Usb_select_device()           (USBCON  &= ~(1<<HOST))
00224 #define Usb_select_host()             (USBCON  |=  (1<<HOST))
00225 #define Is_usb_host_enabled()         ((USBCON  &   (1<<HOST))   ? TRUE : FALSE)
00226 
00227    //! Stop internal USB clock in interface (freeze the interface register)
00228 #define Usb_freeze_clock()            (USBCON  |=  (1<<FRZCLK))
00229 #define Usb_unfreeze_clock()          (USBCON  &= ~(1<<FRZCLK))
00230 #define Is_usb_clock_freezed()        ((USBCON  &   (1<<FRZCLK)) ? TRUE : FALSE)
00231 
00232 #define Usb_enable_id_interrupt()     (USBCON  |=  (1<<IDTE))
00233 #define Usb_disable_id_interrupt()    (USBCON  &= ~(1<<IDTE))
00234 #define Is_usb_id_interrupt_enabled() ((USBCON &  (1<<IDTE))     ? TRUE : FALSE)
00235 #define Is_usb_id_device()            ((USBSTA &   (1<<ID))      ? TRUE : FALSE)
00236 #define Usb_ack_id_transition()       (USBINT  = ~(1<<IDTI))
00237 #define Is_usb_id_transition()        ((USBINT &   (1<<IDTI))    ? TRUE : FALSE)
00238 
00239 #define Usb_enable_vbus_interrupt()   (USBCON  |=  (1<<VBUSTE))
00240 #define Usb_disable_vbus_interrupt()  (USBCON  &= ~(1<<VBUSTE))
00241 #define Is_usb_vbus_interrupt_enabled() ((USBCON &  (1<<VBUSTE))     ? TRUE : FALSE)
00242 #define Is_usb_vbus_high()            ((USBSTA &   (1<<VBUS))    ? TRUE : FALSE)
00243 #define Is_usb_vbus_low()             ((USBSTA &   (1<<VBUS))    ? FALSE : TRUE)
00244 #define Usb_ack_vbus_transition()     (USBINT  = ~(1<<VBUSTI))
00245 #define Is_usb_vbus_transition()      ((USBINT &   (1<<VBUSTI))  ? TRUE : FALSE)
00246 
00247    //! returns the USB general interrupts (interrupt enabled)
00248 #define Usb_get_general_interrupt()      (USBINT & (USBCON & MSK_IDTE_VBUSTE))
00249    //! acks the general interrupts (interrupt enabled)
00250 #define Usb_ack_all_general_interrupt()  (USBINT = ~(USBCON & MSK_IDTE_VBUSTE))
00251 #define Usb_ack_cache_id_transition(x)   ((x)  &= ~(1<<IDTI))
00252 #define Usb_ack_cache_vbus_transition(x) ((x)  &= ~(1<<VBUSTI))
00253 #define Is_usb_cache_id_transition(x)    (((x) &   (1<<IDTI))  )
00254 #define Is_usb_cache_vbus_transition(x)  (((x) &   (1<<VBUSTI)))
00255 
00256    //! returns the USB Pad interrupts (interrupt enabled)
00257 #define Usb_get_otg_interrupt()            (OTGINT & OTGIEN)
00258    //! acks the USB Pad interrupts (interrupt enabled)
00259 #define Usb_ack_all_otg_interrupt()        (OTGINT = ~OTGIEN)
00260 #define Is_otg_cache_bconnection_error(x)  (((x) &   MSK_BCERRI))
00261 #define Usb_ack_cache_bconnection_error(x) ((x)  &= ~MSK_BCERRI)
00262 
00263 #define Usb_enter_dpram_mode()        (UDPADDH =  (1<<DPACC))
00264 #define Usb_exit_dpram_mode()         (UDPADDH =  (U8)~(1<<DPACC))
00265 #define Usb_set_dpram_address(addr)   (UDPADDH =  (1<<DPACC) + ((Uint16)addr >> 8), UDPADDL = (Uchar)addr)
00266 #define Usb_write_dpram_byte(val)     (UEDATX=val)
00267 #define Usb_read_dpram_byte()                     (UEDATX)
00268 
00269    //! requests for VBus activation
00270 #define Usb_enable_vbus()             (OTGCON  |=  (1<<VBUSREQ))
00271    //! requests for VBus desactivation
00272 #define Usb_disable_vbus()            (OTGCON  |=  (1<<VBUSRQC))
00273    //! Manually request VBUS without UVCON signal from USB interface
00274 #define Usb_enable_manual_vbus()      (PORTE|=0x80,DDRE|=0x80,Usb_disable_uvcon_pin())
00275 
00276    //! initiates a Host Negociation Protocol
00277 #define Usb_device_initiate_hnp()     (OTGCON  |=  (1<<HNPREQ))
00278    //! accepts a Host Negociation Protocol
00279 #define Usb_host_accept_hnp()         (OTGCON  |=  (1<<HNPREQ))
00280    //! rejects a Host Negociation Protocol
00281 #define Usb_host_reject_hnp()         (OTGCON  &= ~(1<<HNPREQ))
00282    //! initiates a Session Request Protocol
00283 #define Usb_device_initiate_srp()     (OTGCON  |=  (1<<SRPREQ))
00284    //! selects VBus as SRP method
00285 #define Usb_select_vbus_srp_method()  (OTGCON  |=  (1<<SRPSEL))
00286    //! selects data line as SRP method
00287 #define Usb_select_data_srp_method()  (OTGCON  &= ~(1<<SRPSEL))
00288    //! enables hardware control on VBus
00289 #define Usb_enable_vbus_hw_control()  (OTGCON  &= ~(1<<VBUSHWC))
00290    //! disables hardware control on VBus
00291 #define Usb_disable_vbus_hw_control() (OTGCON  |=  (1<<VBUSHWC))
00292    //! tests if VBus has been requested
00293 #define Is_usb_vbus_enabled()         ((OTGCON &   (1<<VBUSREQ)) ? TRUE : FALSE)
00294    //! tests if a HNP occurs
00295 #define Is_usb_hnp()                  ((OTGCON &   (1<<HNPREQ))  ? TRUE : FALSE)
00296    //! tests if a SRP from device occurs
00297 #define Is_usb_device_srp()           ((OTGCON &   (1<<SRPREQ))  ? TRUE : FALSE)
00298 
00299    //! enables suspend time out interrupt
00300 #define Usb_enable_suspend_time_out_interrupt()   (OTGIEN  |=  (1<<STOE))
00301    //! disables suspend time out interrupt
00302 #define Usb_disable_suspend_time_out_interrupt()  (OTGIEN  &= ~(1<<STOE))
00303 #define Is_suspend_time_out_interrupt_enabled()   ((OTGIEN &  (1<<STOE))   ? TRUE : FALSE)
00304    //! acks suspend time out interrupt
00305 #define Usb_ack_suspend_time_out_interrupt()      (OTGINT  &= ~(1<<STOI))
00306    //! tests if a suspend time out occurs
00307 #define Is_usb_suspend_time_out_interrupt()       ((OTGINT &   (1<<STOI))    ? TRUE : FALSE)
00308 
00309    //! enables HNP error interrupt
00310 #define Usb_enable_hnp_error_interrupt()          (OTGIEN  |=  (1<<HNPERRE))
00311    //! disables HNP error interrupt
00312 #define Usb_disable_hnp_error_interrupt()         (OTGIEN  &= ~(1<<HNPERRE))
00313 #define Is_hnp_error_interrupt_enabled()          ((OTGIEN &  (1<<HNPERRE))   ? TRUE : FALSE)
00314    //! acks HNP error interrupt
00315 #define Usb_ack_hnp_error_interrupt()             (OTGINT  &= ~(1<<HNPERRI))
00316    //! tests if a HNP error occurs
00317 #define Is_usb_hnp_error_interrupt()              ((OTGINT &   (1<<HNPERRI)) ? TRUE : FALSE)
00318 
00319    //! enables role exchange interrupt
00320 #define Usb_enable_role_exchange_interrupt()      (OTGIEN  |=  (1<<ROLEEXE))
00321    //! disables role exchange interrupt
00322 #define Usb_disable_role_exchange_interrupt()     (OTGIEN  &= ~(1<<ROLEEXE))
00323 #define Is_role_exchange_interrupt_enabled()      ((OTGIEN &  (1<<ROLEEXE))   ? TRUE : FALSE)
00324    //! acks role exchange interrupt
00325 #define Usb_ack_role_exchange_interrupt()         (OTGINT  &= ~(1<<ROLEEXI))
00326    //! tests if a role exchange occurs
00327 #define Is_usb_role_exchange_interrupt()          ((OTGINT &   (1<<ROLEEXI)) ? TRUE : FALSE)
00328 
00329    //! enables B device connection error interrupt
00330 #define Usb_enable_bconnection_error_interrupt()  (OTGIEN  |=  (1<<BCERRE))
00331    //! disables B device connection error interrupt
00332 #define Usb_disable_bconnection_error_interrupt() (OTGIEN  &= ~(1<<BCERRE))
00333 #define Is_bconnection_error_interrupt_enabled()  ((OTGIEN &  (1<<BCERRE))   ? TRUE : FALSE)
00334    //! acks B device connection error interrupt
00335 #define Usb_ack_bconnection_error_interrupt()     (OTGINT  &= ~(1<<BCERRI))
00336    //! tests if a B device connection error occurs
00337 #define Is_usb_bconnection_error_interrupt()      ((OTGINT &   (1<<BCERRI))  ? TRUE : FALSE)
00338 
00339    //! enables VBus error interrupt
00340 #define Usb_enable_vbus_error_interrupt()         (OTGIEN  |=  (1<<VBERRE))
00341    //! disables VBus error interrupt
00342 #define Usb_disable_vbus_error_interrupt()        (OTGIEN  &= ~(1<<VBERRE))
00343 #define Is_vbus_error_interrupt_enabled()         ((OTGIEN &  (1<<VBERRE))   ? TRUE : FALSE)
00344    //! acks VBus error interrupt
00345 #define Usb_ack_vbus_error_interrupt()            (OTGINT  &= ~(1<<VBERRI))
00346    //! tests if a VBus error occurs
00347 #define Is_usb_vbus_error_interrupt()             ((OTGINT &   (1<<VBERRI))  ? TRUE : FALSE)
00348 
00349    //! enables SRP interrupt
00350 #define Usb_enable_srp_interrupt()                (OTGIEN  |=  (1<<SRPE))
00351    //! disables SRP interrupt
00352 #define Usb_disable_srp_interrupt()               (OTGIEN  &= ~(1<<SRPE))
00353 #define Is_srp_interrupt_enabled()                ((OTGIEN &  (1<<SRPE))   ? TRUE : FALSE)
00354    //! acks SRP interrupt
00355 #define Usb_ack_srp_interrupt()                   (OTGINT  &= ~(1<<SRPI))
00356    //! tests if a SRP occurs
00357 #define Is_usb_srp_interrupt()                    ((OTGINT &   (1<<SRPI))    ? TRUE : FALSE)
00358 //! @}
00359 
00360 //! @ingroup usbdriver
00361 //! @defgroup USB_device_driver USB device controller drivers
00362 //! These macros manage the USB Device controller.
00363 //! @{
00364    //! initiates a remote wake-up
00365    #define Usb_initiate_remote_wake_up()             (UDCON   |=  (1<<RMWKUP))
00366    //! detaches from USB bus
00367    #define Usb_detach()                              (UDCON   |=  (1<<DETACH))
00368    //! attaches to USB bus
00369    #define Usb_attach()                              (UDCON   &= ~(1<<DETACH))
00370    //! test if remote wake-up still running
00371    #define Is_usb_pending_remote_wake_up()           ((UDCON & (1<<RMWKUP)) ? TRUE : FALSE)
00372    //! test if the device is detached
00373    #define Is_usb_detached()                         ((UDCON & (1<<DETACH)) ? TRUE : FALSE)
00374 
00375    //! returns the USB device interrupts (interrupt enabled)
00376    #define Usb_get_device_interrupt()                (UDINT   &   (1<<UDIEN))
00377    //! acks the USB device interrupts (interrupt enabled)
00378    #define Usb_ack_all_device_interrupt()            (UDINT   =  ~(1<<UDIEN))
00379 
00380    //! enables remote wake-up interrupt
00381    #define Usb_enable_remote_wake_up_interrupt()     (UDIEN   |=  (1<<UPRSME))
00382    //! disables remote wake-up interrupt
00383    #define Usb_disable_remote_wake_up_interrupt()    (UDIEN   &= ~(1<<UPRSME))
00384 #define Is_remote_wake_up_interrupt_enabled()     ((UDIEN &  (1<<UPRSME))   ? TRUE : FALSE)
00385    //! acks remote wake-up
00386 #define Usb_ack_remote_wake_up_start()            (UDINT   = ~(1<<UPRSMI))
00387    //! tests if remote wake-up still running
00388 #define Is_usb_remote_wake_up_start()             ((UDINT &   (1<<UPRSMI))  ? TRUE : FALSE)
00389 
00390    //! enables resume interrupt
00391 #define Usb_enable_resume_interrupt()             (UDIEN   |=  (1<<EORSME))
00392    //! disables resume interrupt
00393 #define Usb_disable_resume_interrupt()            (UDIEN   &= ~(1<<EORSME))
00394 #define Is_resume_interrupt_enabled()             ((UDIEN &  (1<<EORSME))   ? TRUE : FALSE)
00395    //! acks resume
00396 #define Usb_ack_resume()                          (UDINT   = ~(1<<EORSMI))
00397    //! tests if resume occurs
00398 #define Is_usb_resume()                           ((UDINT &   (1<<EORSMI))  ? TRUE : FALSE)
00399 
00400    //! enables wake-up interrupt
00401 #define Usb_enable_wake_up_interrupt()            (UDIEN   |=  (1<<WAKEUPE))
00402    //! disables wake-up interrupt
00403 #define Usb_disable_wake_up_interrupt()           (UDIEN   &= ~(1<<WAKEUPE))
00404 #define Is_swake_up_interrupt_enabled()           ((UDIEN &  (1<<WAKEUPE))   ? TRUE : FALSE)
00405    //! acks wake-up
00406 #define Usb_ack_wake_up()                         (UDINT   = ~(1<<WAKEUPI))
00407    //! tests if wake-up occurs
00408 #define Is_usb_wake_up()                          ((UDINT &   (1<<WAKEUPI)) ? TRUE : FALSE)
00409 
00410    //! enables USB reset interrupt
00411 #define Usb_enable_reset_interrupt()              (UDIEN   |=  (1<<EORSTE))
00412    //! disables USB reset interrupt
00413 #define Usb_disable_reset_interrupt()             (UDIEN   &= ~(1<<EORSTE))
00414 #define Is_reset_interrupt_enabled()              ((UDIEN &  (1<<EORSTE))   ? TRUE : FALSE)
00415    //! acks USB reset
00416 #define Usb_ack_reset()                           (UDINT   = ~(1<<EORSTI))
00417    //! tests if USB reset occurs
00418 #define Is_usb_reset()                            ((UDINT &   (1<<EORSTI))  ? TRUE : FALSE)
00419 
00420    //! enables Start Of Frame Interrupt
00421 #define Usb_enable_sof_interrupt()                (UDIEN   |=  (1<<SOFE))
00422    //! disables Start Of Frame Interrupt
00423 #define Usb_disable_sof_interrupt()               (UDIEN   &= ~(1<<SOFE))
00424 #define Is_sof_interrupt_enabled()                ((UDIEN &  (1<<SOFE))   ? TRUE : FALSE)
00425    //! acks Start Of Frame
00426 #define Usb_ack_sof()                             (UDINT   = ~(1<<SOFI))
00427    //! tests if Start Of Frame occurs
00428 #define Is_usb_sof()                              ((UDINT &   (1<<SOFI))    ? TRUE : FALSE)
00429 
00430    //! enables suspend state interrupt
00431 #define Usb_enable_suspend_interrupt()            (UDIEN   |=  (1<<SUSPE))
00432    //! disables suspend state interrupt
00433 #define Usb_disable_suspend_interrupt()           (UDIEN   &= ~(1<<SUSPE))
00434 #define Is_suspend_interrupt_enabled()            ((UDIEN &  (1<<SUSPE))   ? TRUE : FALSE)
00435    //! acks Suspend
00436 #define Usb_ack_suspend()                         (UDINT   = ~(1<<SUSPI))
00437    //! tests if Suspend state detected
00438 #define Is_usb_suspend()                          ((UDINT &   (1<<SUSPI))   ? TRUE : FALSE)
00439 
00440    //! enables USB device address
00441 #define Usb_enable_address()                      (UDADDR  |=  (1<<ADDEN))
00442    //! disables USB device address
00443 #define Usb_disable_address()                     (UDADDR  &= ~(1<<ADDEN))
00444    //! sets the USB device address
00445 #define Usb_configure_address(addr)               (UDADDR  =   (UDADDR & (1<<ADDEN)) | ((U8)addr & MSK_UADD))
00446 
00447    //! returns the last frame number
00448 #define Usb_frame_number()                        ((U16)((((U16)UDFNUMH) << 8) | ((U16)UDFNUML)))
00449    //! tests if a crc error occurs in frame number
00450 #define Is_usb_frame_number_crc_error()           ((UDMFN & (1<<FNCERR)) ? TRUE : FALSE)
00451 //! @}
00452 
00453 
00454 
00455 //! @ingroup usbdriver
00456 //! @defgroup usb_gen_ep USB endpoint drivers
00457 //! These macros manage the common features of the endpoints.
00458 //! @{
00459    //! selects the endpoint number to interface with the CPU
00460 #define Usb_select_endpoint(ep)                   (UENUM = (U8)ep )
00461 
00462    //! get the currently selected endpoint number
00463 #define Usb_get_selected_endpoint()               (UENUM )
00464 
00465    //! resets the selected endpoint
00466 #define Usb_reset_endpoint(ep)                    (UERST   =   1 << (U8)ep, UERST  =  0)
00467 
00468    //! enables the current endpoint
00469 #define Usb_enable_endpoint()                     (UECONX  |=  (1<<EPEN))
00470    //! enables the STALL handshake for the next transaction
00471 #define Usb_enable_stall_handshake()              (UECONX  |=  (1<<STALLRQ))
00472    //! resets the data toggle sequence
00473 #define Usb_reset_data_toggle()                   (UECONX  |=  (1<<RSTDT))
00474    //! disables the current endpoint
00475 #define Usb_disable_endpoint()                    (UECONX  &= ~(1<<EPEN))
00476    //! disables the STALL handshake
00477 #define Usb_disable_stall_handshake()             (UECONX  |=  (1<<STALLRQC))
00478    //! selects endpoint interface on CPU
00479 #define Usb_select_epnum_for_cpu()                (UECONX  &= ~(1<<EPNUMS))
00480    //! tests if the current endpoint is enabled
00481 #define Is_usb_endpoint_enabled()                 ((UECONX & (1<<EPEN))    ? TRUE : FALSE)
00482    //! tests if STALL handshake request is running
00483 #define Is_usb_endpoint_stall_requested()         ((UECONX & (1<<STALLRQ)) ? TRUE : FALSE)
00484 
00485    //! configures the current endpoint
00486 #define Usb_configure_endpoint_type(type)         (UECFG0X =   (UECFG0X & ~(MSK_EPTYPE)) | ((U8)type << 6))
00487    //! configures the current endpoint direction
00488 #define Usb_configure_endpoint_direction(dir)     (UECFG0X =   (UECFG0X & ~(1<<EPDIR))  | ((U8)dir))
00489 
00490    //! configures the current endpoint size
00491 #define Usb_configure_endpoint_size(size)         (UECFG1X =   (UECFG1X & ~MSK_EPSIZE) | ((U8)size << 4))
00492    //! configures the current endpoint number of banks
00493 #define Usb_configure_endpoint_bank(bank)         (UECFG1X =   (UECFG1X & ~MSK_EPBK)   | ((U8)bank << 2))
00494    //! allocates the current configuration in DPRAM memory
00495 #define Usb_allocate_memory()                     (UECFG1X |=  (1<<ALLOC))
00496    //! un-allocates the current configuration in DPRAM memory
00497 #define Usb_unallocate_memory()                   (UECFG1X &= ~(1<<ALLOC))
00498 
00499    //! acks endpoint overflow interrupt
00500 #define Usb_ack_overflow_interrupt()              (UESTA0X &= ~(1<<OVERFI))
00501    //! acks endpoint underflow memory
00502 #define Usb_ack_underflow_interrupt()             (UESTA0X &= ~(1<<UNDERFI))
00503    //! acks Zero Length Packet received
00504 #define Usb_ack_zlp()                             (UESTA0X &= ~(1<<ZLPSEEN))
00505    //! returns data toggle
00506 #define Usb_data_toggle()                         ((UESTA0X&MSK_DTSEQ) >> 2)
00507    //! returns the number of busy banks
00508 #define Usb_nb_busy_bank()                        (UESTA0X &   MSK_NBUSYBK)
00509    //! tests if at least one bank is busy
00510 #define Is_usb_one_bank_busy()                    ((UESTA0X &  MSK_NBUSYBK) == 0 ? FALSE : TRUE)
00511    //! tests if current endpoint is configured
00512 #define Is_endpoint_configured()                  ((UESTA0X &  (1<<CFGOK))   ? TRUE : FALSE)
00513    //! tests if an overflows occurs
00514 #define Is_usb_overflow()                         ((UESTA0X &  (1<<OVERFI))  ? TRUE : FALSE)
00515    //! tests if an underflow occurs
00516 #define Is_usb_underflow()                        ((UESTA0X &  (1<<UNDERFI)) ? TRUE : FALSE)
00517    //! tests if a ZLP has been detected
00518 #define Is_usb_zlp()                              ((UESTA0X &  (1<<ZLPSEEN)) ? TRUE : FALSE)
00519 
00520    //! returns the control direction
00521 #define Usb_control_direction()                   ((UESTA1X &  (1<<CTRLDIR)) >> 2)
00522    //! returns the number of the current bank
00523 #define Usb_current_bank()                        ( UESTA1X & MSK_CURRBK)
00524 
00525    //! clears FIFOCON bit
00526 #define Usb_ack_fifocon()                         (UEINTX &= ~(1<<FIFOCON))
00527    //! acks NAK IN received
00528 #define Usb_ack_nak_in()                          (UEINTX &= ~(1<<NAKINI))
00529    //! acks NAK OUT received
00530 #define Usb_ack_nak_out()                         (UEINTX &= ~(1<<NAKOUTI))
00531    //! acks receive SETUP
00532 #define Usb_ack_receive_setup()                   (UEINTX &= ~(1<<RXSTPI))
00533 //! tests if NAK IN received
00534 #define Is_usb_receive_nak_in()                   (UEINTX &(1<<NAKINI))
00535 //! tests if NAK OUT received
00536 #define Is_usb_receive_nak_out()                  (UEINTX &(1<<NAKOUTI))
00537    //! acks reveive OUT
00538 #define Usb_ack_receive_out()                     (UEINTX &= ~(1<<RXOUTI), Usb_ack_fifocon())
00539    //! acks STALL sent
00540 #define Usb_ack_stalled()                         (MSK_STALLEDI=   0)
00541    //! acks IN ready
00542 #define Usb_ack_in_ready()                        (UEINTX &= ~(1<<TXINI), Usb_ack_fifocon())
00543    //! Kills last bank
00544 #define Usb_kill_last_in_bank()                   (UENTTX |= (1<<RXOUTI))
00545    //! tests if endpoint read allowed
00546 #define Is_usb_read_enabled()                     (UEINTX&(1<<RWAL))
00547    //! tests if endpoint write allowed
00548 #define Is_usb_write_enabled()                    (UEINTX&(1<<RWAL))
00549    //! tests if read allowed on control endpoint
00550 #define Is_usb_read_control_enabled()             (UEINTX&(1<<TXINI))
00551    //! tests if SETUP received
00552 #define Is_usb_receive_setup()                    (UEINTX&(1<<RXSTPI))
00553    //! tests if OUT received
00554 #define Is_usb_receive_out()                      (UEINTX&(1<<RXOUTI))
00555    //! tests if IN ready
00556 #define Is_usb_in_ready()                         (UEINTX&(1<<TXINI))
00557    //! sends IN
00558 #define Usb_send_in()                             (UEINTX &= ~(1<<FIFOCON))
00559    //! sends IN on control endpoint
00560 #define Usb_send_control_in()                     (UEINTX &= ~(1<<TXINI))
00561    //! frees OUT bank
00562 #define Usb_free_out_bank()                       (UEINTX &= ~(1<<FIFOCON))
00563    //! acks OUT on control endpoint
00564 #define Usb_ack_control_out()                     (UEINTX &= ~(1<<RXOUTI))
00565 
00566    //! enables flow error interrupt
00567 #define Usb_enable_flow_error_interrupt()         (UEIENX  |=  (1<<FLERRE))
00568    //! enables NAK IN interrupt
00569 #define Usb_enable_nak_in_interrupt()             (UEIENX  |=  (1<<NAKINE))
00570    //! enables NAK OUT interrupt
00571 #define Usb_enable_nak_out_interrupt()            (UEIENX  |=  (1<<NAKOUTE))
00572    //! enables receive SETUP interrupt
00573 #define Usb_enable_receive_setup_interrupt()      (UEIENX  |=  (1<<RXSTPE))
00574    //! enables receive OUT interrupt
00575 #define Usb_enable_receive_out_interrupt()        (UEIENX  |=  (1<<RXOUTE))
00576    //! enables STALL sent interrupt
00577 #define Usb_enable_stalled_interrupt()            (UEIENX  |=  (1<<STALLEDE))
00578    //! enables IN ready interrupt
00579 #define Usb_enable_in_ready_interrupt()           (UEIENX  |=  (1<<TXINE))
00580    //! disables flow error interrupt
00581 #define Usb_disable_flow_error_interrupt()        (UEIENX  &= ~(1<<FLERRE))
00582    //! disables NAK IN interrupt
00583 #define Usb_disable_nak_in_interrupt()            (UEIENX  &= ~(1<<NAKINE))
00584    //! disables NAK OUT interrupt
00585 #define Usb_disable_nak_out_interrupt()           (UEIENX  &= ~(1<<NAKOUTE))
00586    //! disables receive SETUP interrupt
00587 #define Usb_disable_receive_setup_interrupt()     (UEIENX  &= ~(1<<RXSTPE))
00588    //! disables receive OUT interrupt
00589 #define Usb_disable_receive_out_interrupt()       (UEIENX  &= ~(1<<RXOUTE))
00590    //! disables STALL sent interrupt
00591 #define Usb_disable_stalled_interrupt()           (UEIENX  &= ~(1<<STALLEDE))
00592    //! disables IN ready interrupt
00593 #define Usb_disable_in_ready_interrupt()          (UEIENX  &= ~(1<<TXIN))
00594 
00595    //! returns FIFO byte for current endpoint
00596 #define Usb_read_byte()                           (UEDATX)
00597    //! writes byte in FIFO for current endpoint
00598 #define Usb_write_byte(byte)                      (UEDATX  =   (U8)byte)
00599 
00600    //! returns number of bytes in FIFO current endpoint (16 bits)
00601 #define Usb_byte_counter()                        ((((U16)UEBCHX) << 8) | (UEBCLX))
00602    //! returns number of bytes in FIFO current endpoint (8 bits)
00603 #define Usb_byte_counter_8()                      ((U8)UEBCLX)
00604 
00605    //! tests the general endpoint interrupt flags
00606 #define Usb_interrupt_flags()                     (UEINT)
00607    //! tests the general endpoint interrupt flags
00608 #define Is_usb_endpoint_event()                   (Usb_interrupt_flags() != 0x00)
00609 //! @}
00610 
00611 
00612 //! @ingroup usbdriver
00613 //! @defgroup host_management USB host controller drivers
00614 //! These macros manage the USB Host controller.
00615 //! @{
00616    //! allocates the current configuration in DPRAM memory
00617    #define Host_allocate_memory()                 (UPCFG1X |=  (1<<ALLOC))
00618    //! un-allocates the current configuration in DPRAM memory
00619    #define Host_unallocate_memory()               (UPCFG1X &= ~(1<<ALLOC))
00620 
00621    //! enables USB Host function
00622    #define Host_enable()                          (USBCON |= (1<<HOST))
00623 
00624    #ifndef    SOFEN
00625    #define    SOFEN           0       //For AVRGCC, SOFEN bit missing in default sfr file
00626    #endif
00627    //! enables SOF generation
00628    #define Host_enable_sof()                      (UHCON |= (1<<SOFEN))
00629    //! disables SOF generation
00630    #define Host_disable_sof()                     (UHCON &= ~(1<<SOFEN))
00631    //! sends a USB Reset to the device
00632    #define Host_send_reset()                      (UHCON |= (1<<RESET))
00633    //! tests if USB Reset running
00634    #define Host_is_reset()                        ((UHCON & (1<<RESET)) ? TRUE : FALSE)
00635    //! sends a USB Resume to the device
00636    #define Host_send_resume()                     (UHCON |= (1<<RESUME))
00637    //! tests if USB Resume running
00638    #define Host_is_resume()                       ((UHCON & (1<<RESUME)) ? TRUE : FALSE)
00639 
00640    //! enables host start of frame interrupt
00641    #define Host_enable_sof_interrupt()            (UHIEN |= (1<<HSOFE))
00642    //! enables host start of frame interrupt
00643    #define Host_disable_sof_interrupt()           (UHIEN &= ~(1<<HSOFE))
00644 #define Is_host_sof_interrupt_enabled()        ((UHIEN &  (1<<HSOFE))   ? TRUE : FALSE)
00645    //! tests if SOF detected
00646 #define Host_is_sof()                          ((UHINT & (1<<HSOFI)) ? TRUE : FALSE)
00647 #define Is_host_sof()                          ((UHINT & (1<<HSOFI)) ? TRUE : FALSE)
00648 #define Host_ack_sof()                         (UHINT &= ~(1<<HSOFI))
00649 
00650    //! enables host wake up interrupt detection
00651 #define Host_enable_hwup_interrupt()            (UHIEN |= (1<<HWUPE))
00652    //! disables host wake up interrupt detection
00653 #define Host_disable_hwup_interrupt()           (UHIEN &= ~(1<<HWUPE))
00654 #define Is_host_hwup_interrupt_enabled()        ((UHIEN &  (1<<HWUPE))   ? TRUE : FALSE)
00655    //! tests if host wake up detected
00656 #define Host_is_hwup()                          ((UHINT & (1<<HWUPI)) ? TRUE : FALSE)
00657    //! Ack host wake up detection
00658 #define Is_host_hwup()                          ((UHINT & (1<<HWUPI)) ? TRUE : FALSE)
00659 #define Host_ack_hwup()                         (UHINT &= ~(1<<HWUPI))
00660 
00661    //! enables host down stream rsm sent interrupt detection
00662 #define Host_enable_down_stream_resume_interrupt()            (UHIEN |= (1<<RSMEDE))
00663    //! disables host down stream rsm sent interrupt detection
00664 #define Host_disable_down_stream_resume_interrupt()           (UHIEN &= ~(1<<RSMEDE))
00665 #define Is_host_down_stream_resume_interrupt_enabled()        ((UHIEN &  (1<<RSMEDE))   ? TRUE : FALSE)
00666    //! Ack host down stream resume sent
00667 #define Is_host_down_stream_resume()                          ((UHINT & (1<<RSMEDI)) ? TRUE : FALSE)
00668 #define Host_ack_down_stream_resume()                         (UHINT &= ~(1<<RSMEDI))
00669 
00670    //! enables host remote wake up interrupt detection
00671 #define Host_enable_remote_wakeup_interrupt()         (UHIEN |= (1<<RXRSME))
00672    //! disables host remote wake up interrupt detection
00673 #define Host_disable_remote_wakeup_interrupt()        (UHIEN &= ~(1<<RXRSME))
00674 #define Is_host_remote_wakeup_interrupt_enabled()     ((UHIEN &  (1<<RXRSME))   ? TRUE : FALSE)
00675    //! tests if host wake up detected
00676 #define Host_is_remote_wakeup()                       ((UHINT & (1<<RXRSMI)) ? TRUE : FALSE)
00677    //! Ack host wake up detection
00678 #define Is_host_remote_wakeup()                       ((UHINT & (1<<RXRSMI)) ? TRUE : FALSE)
00679 #define Host_ack_remote_wakeup()                      (UHINT &= ~(1<<RXRSMI))
00680 
00681    //! enables host device connection interrupt
00682 #define Host_enable_device_connection_interrupt()        (UHIEN |= (1<<DCONNE))
00683    //! disables USB device connection interrupt
00684 #define Host_disable_device_connection_interrupt()    (UHIEN &= ~(1<<DCONNE))
00685 #define Is_host_device_connection_interrupt_enabled()    ((UHIEN &  (1<<DCONNE))   ? TRUE : FALSE)
00686    //! tests if a USB device has been detected
00687 #define Is_device_connection()                 (UHINT & (1<<DCONNI))
00688    //! acks device connection
00689 #define Host_ack_device_connection()           (UHINT = ~(1<<DCONNI))
00690 
00691    //! enables host device disconnection interrupt
00692 #define Host_enable_device_disconnection_interrupt()     (UHIEN |= (1<<DDISCE))
00693    //! disables USB device connection interrupt
00694 #define Host_disable_device_disconnection_interrupt()    (UHIEN &= ~(1<<DDISCE))
00695 #define Is_host_device_disconnection_interrupt_enabled() ((UHIEN &  (1<<DDISCE))   ? TRUE : FALSE)
00696    //! tests if a USB device has been removed
00697 #define Is_device_disconnection()              (UHINT & (1<<DDISCI)   ? TRUE : FALSE)
00698    //! acks device disconnection
00699 #define Host_ack_device_disconnection()        (UHINT = ~(1<<DDISCI))
00700 
00701    //! enables host USB reset interrupt
00702 #define Host_enable_reset_interrupt()          (UHIEN   |=  (1<<RSTE))
00703    //! disables host USB reset interrupt
00704 #define Host_disable_reset_interrupt()         (UHIEN   &= ~(1<<RSTE))
00705 #define Is_host_reset_interrupt_enabled()      ((UHIEN &  (1<<RSTE))   ? TRUE : FALSE)
00706    //! acks host USB reset sent
00707 #define Host_ack_reset()                       (UHINT   = ~(1<<RSTI))
00708    //! tests if USB reset has been sent
00709 #define Is_host_reset()                        Host_is_reset()
00710 
00711 
00712    //! switches on VBus
00713 #define Host_vbus_request()                    (OTGCON |= (1<<VBUSREQ))
00714    //! switches off VBus
00715 #define Host_clear_vbus_request()              (OTGCON |= (1<<VBUSRQC))
00716    //! configures the address to use for the device
00717 #define Host_configure_address(addr)           (UHADDR = addr & MSK_HADDR)
00718 
00719    //! Get connected device speed, returns TRUE when in full speed mode
00720 #define Is_host_full_speed()                   ((USBSTA &  (1<<SPEED))   ? TRUE : FALSE)
00721 //! @}
00722 
00723 
00724 //! @ingroup usbdriver
00725 //! @defgroup general_pipe USB pipe drivers
00726 //! These macros manage the common features of the pipes.
00727 //! @{
00728    //! selects pipe for CPU interface
00729 #define Host_select_pipe(p)                    (UPNUM = (U8)p)
00730 
00731    //! get the currently selected pipe number
00732 #define Host_get_selected_pipe()              (UPNUM )
00733 
00734    //! enables pipe
00735 #define Host_enable_pipe()                     (UPCONX |= (1<<PEN))
00736    //! disables pipe
00737 #define Host_disable_pipe()                    (UPCONX &= ~(1<<PEN))
00738 
00739    //! sets SETUP token
00740 #define Host_set_token_setup()                 (UPCFG0X =  UPCFG0X & ~MSK_TOKEN_SETUP)
00741    //! sets IN token
00742 #define Host_set_token_in()                    (UPCFG0X = (UPCFG0X & ~MSK_TOKEN_SETUP) | MSK_TOKEN_IN)
00743    //! sets OUT token
00744 #define Host_set_token_out()                   (UPCFG0X = (UPCFG0X & ~MSK_TOKEN_SETUP) | MSK_TOKEN_OUT)
00745 
00746    //! returns the number of the endpoint associated to the current pipe
00747 #define Host_get_endpoint_number()             (UPCFG0X & (MSK_PEPNUM))
00748 
00749    //! returns pipe interrupt register
00750 #define Host_get_pipe_interrupt()              (UPINT)
00751 
00752    //! sets the interrupt frequency
00753 #define Host_set_interrupt_frequency(frq)      (UPCFG2X = (U8)frq)
00754 
00755    //! tests if current pipe is configured
00756 #define Is_pipe_configured()                   (UPSTAX  &  (1<<CFGOK))
00757    //! tests if at least one bank is busy
00758 #define Is_host_one_bank_busy()                ((UPSTAX &  (1<<MSK_NBUSYBK)) != 0)
00759    //! returns the number of busy banks
00760 #define Host_number_of_busy_bank()             (UPSTAX &  (1<<MSK_NBUSYBK))
00761 
00762    //! resets the pipe
00763 #define Host_reset_pipe(p)                     (UPRST = 1<<p , UPRST = 0)
00764 
00765    //! writes a byte into the pipe FIFO
00766 #define Host_write_byte(dat)                   (UPDATX = dat)
00767    //! reads a byte from the pipe FIFO
00768 #define Host_read_byte()                       (UPDATX)
00769 
00770    //! freezes the pipe
00771 #define Host_freeze_pipe()                     (UPCONX |=  (1<<PFREEZE))
00772    //! un-freezees the pipe
00773 #define Host_unfreeze_pipe()                   (UPCONX &= ~(1<<PFREEZE))
00774    //! tests if the current pipe is frozen
00775 #define Is_host_pipe_freeze()                  (UPCONX &   (1<<PFREEZE))
00776 
00777    //! resets data toggle
00778 #define Host_reset_pipe_data_toggle()          (UPCONX |=  (1<<RSTDT)  )
00779 
00780    //! tests if SETUP has been sent
00781 #define Is_host_setup_sent()                   ((UPINTX & (1<<TXSTPI))    ? TRUE : FALSE)
00782    //! tests if control IN has been received
00783 #define Is_host_control_in_received()          ((UPINTX & (1<<RXINI))    ? TRUE : FALSE)
00784    //! tests if control OUT has been sent
00785 #define Is_host_control_out_sent()             ((UPINTX & (1<<TXOUTI))    ? TRUE : FALSE)
00786    //! tests if a STALL has been received
00787 #define Is_host_stall()                        ((UPINTX & (1<<RXSTALLI))    ? TRUE : FALSE)
00788    //! tests if an error occurs on current pipe
00789 #define Is_host_pipe_error()                   ((UPINTX & (1<<PERRI))    ? TRUE : FALSE)
00790    //! sends a setup
00791 #define Host_send_setup()                      (UPINTX  &= ~(1<<FIFOCON))
00792    //! sends a control IN
00793 #define Host_send_control_in()                 (UPINTX  &= ~(1<<FIFOCON))
00794    //! sends a control OUT
00795 #define Host_send_control_out()                (UPINTX  &= ~(1<<FIFOCON))
00796    //! acks control OUT
00797 #define Host_ack_control_out()                 (UPINTX  &= ~(1<<TXOUTI))
00798    //! acks control IN
00799 #define Host_ack_control_in()                  (UPINTX  &= ~(1<<RXINI))
00800    //! acks setup
00801 #define Host_ack_setup()                       (UPINTX  &= ~(1<<TXSTPI))
00802    //! acks STALL reception
00803 #define Host_ack_stall()                       (UPINTX  &= ~(1<<RXSTALLI))
00804 
00805    //! sends a OUT
00806 #define Host_send_out()                        (UPINTX &= ~(1<<FIFOCON))
00807    //! tests if OUT has been sent
00808 #define Is_host_out_sent()                     ((UPINTX & (1<<TXOUTI))    ? TRUE : FALSE)
00809    //! acks OUT sent
00810 #define Host_ack_out_sent()                    (UPINTX &= ~(1<<TXOUTI))
00811    //! tests if IN received
00812 #define Is_host_in_received()                  ((UPINTX & (1<<RXINI))    ? TRUE : FALSE)
00813    //! acks IN reception
00814 #define Host_ack_in_received()                 (UPINTX &= ~(1<<RXINI))
00815    //! sends a IN
00816 #define Host_send_in()                         (UPINTX &= ~(1<<FIFOCON))
00817    //! tests if nak handshake has been received
00818 #define Is_host_nak_received()                 ((UPINTX & (1<<NAKEDI))    ? TRUE : FALSE)
00819    //! acks NAk received sent
00820 #define Host_ack_nak_received()                (UPINTX &= ~(1<<NAKEDI))
00821 
00822 
00823 
00824    //! tests if endpoint read allowed
00825 #define Is_host_read_enabled()                 (UPINTX&(1<<RWAL))
00826    //! tests if endpoint read allowed
00827 #define Is_host_write_enabled()                 (UPINTX&(1<<RWAL))
00828 
00829    //! sets IN in standard mode
00830 #define Host_standard_in_mode()                (UPCONX &= ~(1<<INMODE))
00831    //! sets IN in continuous mode
00832 #define Host_continuous_in_mode()              (UPCONX |=  (1<<INMODE))
00833 
00834    //! sets number of IN requests to perform before freeze
00835 #define Host_in_request_number(in_num)         (UPINRQX = (U8)in_num)
00836    //! returns number of remaining IN requests
00837 #define Host_get_in_request_number()           (UPINRQX)
00838 
00839    //! returns number of bytes (8 bits)
00840 #define Host_data_length_U8()                  (UPBCLX)
00841    //! returns number of bytes (16 bits)
00842 #define Host_data_length_U16()                 ((((U16)UPBCHX)<<8) | UPBCLX)
00843    //! for device compatibility
00844 #define Host_byte_counter()                    Host_data_length_U16()
00845    //! for device compatibility
00846 #define Host_byte_counter_8()                  Host_data_length_U8()
00847 
00848    //! returns the size of the current pipe
00849 #define Host_get_pipe_length()                 ((U16)0x08 << ((UPCFG1X & MSK_PSIZE)>>4))
00850 
00851    //! returns the type of the current pipe
00852 #define Host_get_pipe_type()                   (UPCFG0X>>6)
00853 
00854    //! tests if error occurs on pipe
00855 #define Host_error_status()                    (UPERRX & MSK_ERROR)
00856    //! acks all pipe error
00857 #define Host_ack_all_errors()                  (UPERRX = 0x00)
00858 
00859    //! Enable pipe end transmission interrupt
00860 #define Host_enable_transmit_interrupt()       (UPIENX |= (1<<TXOUTE))
00861    //! Disable pipe end transmission interrupt
00862 #define Host_disable_transmit_interrupt()      (UPIENX &= ~(1<<TXOUTE))
00863 
00864    //! Enable pipe reception interrupt
00865 #define Host_enable_receive_interrupt()        (UPIENX |= (1<<RXINE))
00866    //! Disable pipe recption interrupt
00867 #define Host_disable_receive_interrupt()       (UPIENX &= ~(1<<RXINE))
00868 
00869    //! Enable pipe stall interrupt
00870 #define Host_enable_stall_interrupt()        (UPIENX |= (1<<RXSTALLE))
00871    //! Disable pipe stall interrupt
00872 #define Host_disable_stall_interrupt()       (UPIENX &= ~(1<<RXSTALLE))
00873 
00874    //! Enable pipe error interrupt
00875 #define Host_enable_error_interrupt()        (UPIENX |= (1<<PERRE))
00876    //! Disable pipe error interrupt
00877 #define Host_disable_error_interrupt()       (UPIENX &= ~(1<<PERRE))
00878 
00879    //! Enable pipe NAK interrupt
00880 #define Host_enable_nak_interrupt()        (UPIENX |= (1<<NAKEDE))
00881    //! Disable pipe NAK interrupt
00882 #define Host_disable_nak_interrupt()       (UPIENX &= ~(1<<NAKEDE))
00883 
00884 #define Get_pipe_token(x)                 ((x & (0x80)) ? TOKEN_IN : TOKEN_OUT)
00885 
00886 //! @}
00887 
00888 //! wSWAP
00889 //! This macro swaps the U8 order in words.
00890 //!
00891 //! @param x        (U16) the 16 bit word to swap
00892 //!
00893 //! @return         (U16) the 16 bit word x with the 2 bytes swaped
00894 
00895 #define wSWAP(x)        \
00896    (   (((x)>>8)&0x00FF) \
00897    |   (((x)<<8)&0xFF00) \
00898    )
00899 
00900 
00901 //! Usb_write_word_enum_struc
00902 //! This macro help to fill the U16 fill in USB enumeration struct.
00903 //! Depending on the CPU architecture, the macro swap or not the nibbles
00904 //!
00905 //! @param x        (U16) the 16 bit word to be written
00906 //!
00907 //! @return         (U16) the 16 bit word written
00908 #if !defined(BIG_ENDIAN) && !defined(LITTLE_ENDIAN)
00909         #error YOU MUST Define the Endian Type of target: LITTLE_ENDIAN or BIG_ENDIAN
00910 #endif
00911 #ifdef LITTLE_ENDIAN
00912         #define Usb_write_word_enum_struc(x)    (x)
00913 #else //BIG_ENDIAN
00914         #define Usb_write_word_enum_struc(x)    (wSWAP(x))
00915 #endif
00916 
00917 
00918 //_____ D E C L A R A T I O N ______________________________________________
00919 
00920 U8      usb_config_ep                (U8, U8);
00921 U8      usb_select_enpoint_interrupt (void);
00922 U8      usb_send_packet              (U8 , U8*, U8);
00923 U8      usb_read_packet              (U8 , U8*, U8);
00924 void    usb_halt_endpoint            (U8);
00925 U8      usb_init_device              (void);
00926 
00927 U8      host_config_pipe             (U8, U8);
00928 U8      host_determine_pipe_size     (U16);
00929 void    host_disable_all_pipe        (void);
00930 U8      usb_get_nb_pipe_interrupt    (void);
00931 
00932 U8 usb_endpoint_wait_for_read_control_enabled();
00933 U8 usb_endpoint_wait_for_write_enabled();
00934 U8 usb_endpoint_wait_for_receive_out();
00935 U8 usb_endpoint_wait_for_IN_ready();
00936 
00937 #define usb_endpoint_wait_for_read_enabled usb_endpoint_wait_for_write_enabled
00938 
00939 #endif  // _USB_DRV_H_
00940 
00941 /** @} */