usb_drv.c File Reference

#include "config.h"
#include "conf_usb.h"
#include "usb_drv.h"

Include dependency graph for usb_drv.c:

Go to the source code of this file.

Functions

U8 usb_config_ep (U8 config0, U8 config1)
 usb_configure_endpoint.
U8 usb_select_enpoint_interrupt (void)
 usb_select_endpoint_interrupt.
U8 usb_send_packet (U8 ep_num, U8 *tbuf, U8 data_length)
 usb_send_packet.
U8 usb_read_packet (U8 ep_num, U8 *rbuf, U8 data_length)
 usb_read_packet.
void usb_halt_endpoint (U8 ep_num)
 usb_halt_endpoint.
U8 usb_init_device (void)
 usb_init_device.
U8 host_config_pipe (U8 config0, U8 config1)
 --------------------------------------------------------- ------------------ HOST --------------------------------- ---------------------------------------------------------
U8 host_determine_pipe_size (U16 size)
 host_determine_pipe_size.
void host_disable_all_pipe (void)
 host_disable_all_pipe.
U8 usb_get_nb_pipe_interrupt (void)


Detailed Description

This file contains the USB driver routines.

Author:
Atmel Corporation: http://www.atmel.com
Support and FAQ: http://support.atmel.no/

Definition in file usb_drv.c.


Function Documentation

U8 usb_config_ep ( U8  config0,
U8  config1 
)

usb_configure_endpoint.

This function configures an endpoint with the selected type.

Parameters:
config0 
config1 
Returns:
Is_endpoint_configured.

Definition at line 67 of file usb_drv.c.

00068 {
00069     Usb_enable_endpoint();
00070     UECFG0X = config0;
00071     UECFG1X = (UECFG1X & (1<<ALLOC)) | config1;
00072     Usb_allocate_memory();
00073     return (Is_endpoint_configured());
00074 }

U8 usb_select_enpoint_interrupt ( void   ) 

usb_select_endpoint_interrupt.

This function select the endpoint where an event occurs and returns the number of this endpoint. If no event occurs on the endpoints, this function returns 0.

Parameters:
none 
Returns:
endpoint number.

Definition at line 87 of file usb_drv.c.

00088 {
00089 U8 interrupt_flags;
00090 U8 ep_num;
00091 
00092    ep_num = 0;
00093    interrupt_flags = Usb_interrupt_flags();
00094 
00095    while(ep_num < MAX_EP_NB)
00096    {
00097       if (interrupt_flags & 1)
00098       {
00099          return (ep_num);
00100       }
00101       else
00102       {
00103          ep_num++;
00104          interrupt_flags = interrupt_flags >> 1;
00105       }
00106    }
00107    return 0;
00108 }

U8 usb_send_packet ( U8  ep_num,
U8 tbuf,
U8  data_length 
)

usb_send_packet.

This function moves the data pointed by tbuf to the selected endpoint fifo and sends it through the USB.

Parameters:
ep_num number of the addressed endpoint
*tbuf address of the first data to send
data_length number of bytes to send
Returns:
address of the next U8 to send.
Example: usb_send_packet(3,&first_data,0x20); // send packet on the endpoint #3 while(!(Usb_tx_complete)); // wait packet ACK'ed by the Host Usb_clear_tx_complete(); // acknowledge the transmit

Note: tbuf is incremented of 'data_length'.

Definition at line 130 of file usb_drv.c.

00131 {
00132 U8 remaining_length;
00133 
00134    remaining_length = data_length;
00135    Usb_select_endpoint(ep_num);
00136    while(Is_usb_write_enabled() && (0 != remaining_length))
00137    {
00138       Usb_write_byte(*tbuf);
00139       remaining_length--;
00140       tbuf++;
00141    }
00142    return remaining_length;
00143 }

U8 usb_read_packet ( U8  ep_num,
U8 rbuf,
U8  data_length 
)

usb_read_packet.

This function moves the data stored in the selected endpoint fifo to the address specified by *rbuf.

Parameters:
ep_num number of the addressed endpoint
*rbuf aaddress of the first data to write with the USB data
data_length number of bytes to read
Returns:
address of the next U8 to send.
Example: while(!(Usb_rx_complete)); // wait new packet received usb_read_packet(4,&first_data,usb_get_nb_byte); // read packet from ep 4 Usb_clear_rx(); // acknowledge the transmit

Note: rbuf is incremented of 'data_length'.

Definition at line 165 of file usb_drv.c.

00166 {
00167 U8 remaining_length;
00168 
00169    remaining_length = data_length;
00170    Usb_select_endpoint(ep_num);
00171 
00172    while(Is_usb_read_enabled() && (0 != remaining_length))
00173    {
00174       *rbuf = Usb_read_byte();
00175       remaining_length--;
00176       rbuf++;
00177    }
00178    return remaining_length;
00179 }

void usb_halt_endpoint ( U8  ep_num  ) 

usb_halt_endpoint.

This function sends a STALL handshake for the next Host request. A STALL handshake will be send for each next request untill a SETUP or a Clear Halt Feature occurs for this endpoint.

Parameters:
ep_num number of the addressed endpoint
Returns:
none

Definition at line 191 of file usb_drv.c.

00192 {
00193    Usb_select_endpoint(ep_num);
00194    Usb_enable_stall_handshake();
00195 }

U8 usb_init_device ( void   ) 

usb_init_device.

This function initializes the USB device controller and configures the Default Control Endpoint.

Parameters:
none 
Returns:
status

Definition at line 207 of file usb_drv.c.

Referenced by usb_general_interrupt(), and usb_start_device().

00208 {
00209    Usb_select_device();
00210    if(Is_usb_id_device())
00211    {
00212       Usb_select_endpoint(EP_CONTROL);
00213       if(!Is_usb_endpoint_enabled())
00214       {
00215 #if (USB_LOW_SPEED_DEVICE==DISABLE)
00216          return usb_configure_endpoint(EP_CONTROL,    \
00217                                 TYPE_CONTROL,  \
00218                                 DIRECTION_OUT, \
00219                                 SIZE_64,       \
00220                                 ONE_BANK,      \
00221                                 NYET_DISABLED);
00222 #else
00223          return usb_configure_endpoint(EP_CONTROL,    \
00224                                 TYPE_CONTROL,  \
00225                                 DIRECTION_OUT, \
00226                                 SIZE_8,       \
00227                                 ONE_BANK,      \
00228                                 NYET_DISABLED);
00229 #endif
00230       }
00231    }
00232    return FALSE;
00233 }

Here is the caller graph for this function:

U8 host_config_pipe ( U8  config0,
U8  config1 
)

--------------------------------------------------------- ------------------ HOST --------------------------------- ---------------------------------------------------------

usb_configure_pipe.

This function configures a pipe with the selected type.

Parameters:
config0 
config1 
Returns:
Is_endpoint_configured.

Definition at line 252 of file usb_drv.c.

00253 {
00254     Host_enable_pipe();
00255     UPCFG0X = config0;
00256     UPCFG1X = config1;
00257     Host_allocate_memory();
00258     return (Is_pipe_configured());
00259 }

U8 host_determine_pipe_size ( U16  size  ) 

host_determine_pipe_size.

This function returns the size configuration register value according to the endpint size detected inthe device enumeration process.

Returns:
pipe size register value.

Definition at line 268 of file usb_drv.c.

Referenced by host_auto_configure_endpoint().

00269 {
00270         if(size <= 8  ) {return (SIZE_8   );}
00271    else if(size <= 16 ) {return (SIZE_16  );}
00272    else if(size <= 32 ) {return (SIZE_32  );}
00273    else if(size <= 64 ) {return (SIZE_64  );}
00274    else if(size <= 128) {return (SIZE_128 );}
00275    else if(size <= 256) {return (SIZE_256 );}
00276    else if(size <= 512) {return (SIZE_512 );}
00277    else                 {return (SIZE_1024);}
00278 
00279 }

Here is the caller graph for this function:

void host_disable_all_pipe ( void   ) 

host_disable_all_pipe.

This function disable all pipes for the host controller Usefull to execute upon device disconnection.

Returns:
none.

Definition at line 288 of file usb_drv.c.

Referenced by usb_general_interrupt().

00289 {
00290 U8 i;
00291    for (i=0;i<7;i++)
00292    {
00293       Host_reset_pipe(i);
00294       Host_select_pipe(i);
00295       Host_unallocate_memory();
00296       Host_disable_pipe();
00297    }
00298 }

Here is the caller graph for this function:

U8 usb_get_nb_pipe_interrupt ( void   ) 

Returns the pipe number that generates a USB communication interrupt This function sould be called only when an interrupt has been detected. Otherwize the return value is incorect

Parameters:
none 
Returns:
pipe_number

Definition at line 309 of file usb_drv.c.

Referenced by usb_pipe_interrupt().

00310 {
00311 U8 interrupt_flags;
00312 U8 i;
00313 
00314    interrupt_flags = Host_get_pipe_interrupt();
00315    for(i=0;i< MAX_EP_NB;i++)
00316    {
00317       if (interrupt_flags & (1<<i))
00318       {
00319          return (i);
00320       }
00321    }
00322    // This return should never occurs ....
00323    return MAX_EP_NB+1;
00324 }

Here is the caller graph for this function:


Generated on Mon Nov 3 10:08:25 2008 for ATMEL by  doxygen 1.5.3