usb_host_hub.h File Reference

#include "modules/usb/usb_task.h"

Include dependency graph for usb_host_hub.h:

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Defines

#define HUB_CLASS   0x09
#define C_HUB_LOCAL_POWER   0
#define C_HUB_OVER_CURRENT   1
#define PORT_CONNECTION   0
#define PORT_ENABLE   1
#define PORT_SUSPEND   2
#define PORT_OVER_CURRENT   3
#define PORT_RESET   4
#define PORT_POWER   8
#define PORT_LOW_SPEED   9
#define C_PORT_CONNECTION   16
#define C_PORT_ENABLE   17
#define C_PORT_SUSPEND   18
#define C_PORT_OVER_CURRENT   19
#define C_PORT_RESET   20
#define PORT_TEST   21
#define PORT_INDICATOR   22
#define NB_PORT_OFFSET   2
#define HUB_DEVICE_POWERED   2
#define HUB_DEVICE_CONNECT   3
#define HUB_DEVICE_WAIT_RST_1   4
#define HUB_DEVICE_WAIT_RST_2   5
#define HUB_DEVICE_READY   6
#define HUB_PORT_CONNECTION   0
#define HUB_PORT_RESET   1
#define HUB_PORT_DISCONNECT   2
#define Clear_hub_feature(feature_selector)
 Clear_hub_feature.
#define Clear_port_feature(feature_selector, port)
 Clear_port_feature.
#define Get_hub_descriptor()
 Get_hub_descriptor.
#define Get_hub_status()
 Get_hub_status.
#define Get_port_status(port)
 Get_port_status.
#define Set_hub_feature(feature)
 Set_hub_feature.
#define Set_port_feature(feature, port)
 Set_port_feature.
#define Set_port_indicator_green(i)   Set_port_feature(PORT_INDICATOR,0x0200+i)
#define Set_port_indicator_amber(i)   Set_port_feature(PORT_INDICATOR,0x0100+i)
#define Set_port_indicator_auto(i)   Set_port_feature(PORT_INDICATOR,0x0300+i)
#define Set_port_indicator_off(i)   Set_port_feature(PORT_INDICATOR,0x0000+i)
#define Set_port_reset(i)   Set_port_feature(PORT_RESET,i)
#define Set_port_suspend(i)   Set_port_feature(PORT_SUSPEND,i)
#define Clear_port_suspend(i)   Clear_port_feature(PORT_SUSPEND,i)
#define Set_port_power(i)   Set_port_feature(PORT_POWER,i);
#define Clear_port_power(i)   Clear_port_feature(PORT_POWER,i);

Functions

U32 get_port_status (U8 port_number)
void hub_manage_port_change_status (U8 port_change_status, U8 hub_number)
void enumerate_hub_port_device (U8 hub_port, U8 port_ev, U8 hub_number)
void hub_init (U8 hub_number)

Variables

U8 f_hub_port_disconnect
 Flag to store device connection event.
U8 hub_device_address [USB_MAX_HUB_NUMBER]
 Table to store the device address of the hub connected in the USB tree.
U8 hub_port_state [USB_MAX_HUB_NUMBER][HUB_MAX_NB_PORT]
 Enumeration state machine for each port of each hub.
U8 nb_hub_present
 The number of hub connected in the USB tree.
U8 hub_device_address [USB_MAX_HUB_NUMBER]
 Table to store the device address of the hub connected in the USB tree.
U8 nb_hub_present
 The number of hub connected in the USB tree.


Detailed Description

USB host hub support header file - Compiler: IAR EWAVR and GNU GCC for AVR

Definition in file usb_host_hub.h.


Define Documentation

#define HUB_CLASS   0x09

Definition at line 59 of file usb_host_hub.h.

Referenced by enumerate_hub_port_device(), remove_device_entry(), and usb_host_task().

#define C_HUB_LOCAL_POWER   0

Definition at line 63 of file usb_host_hub.h.

#define C_HUB_OVER_CURRENT   1

Definition at line 64 of file usb_host_hub.h.

#define PORT_CONNECTION   0

Definition at line 65 of file usb_host_hub.h.

Referenced by hub_manage_port_change_status().

#define PORT_ENABLE   1

Definition at line 66 of file usb_host_hub.h.

#define PORT_SUSPEND   2

Definition at line 67 of file usb_host_hub.h.

#define PORT_OVER_CURRENT   3

Definition at line 68 of file usb_host_hub.h.

#define PORT_RESET   4

Definition at line 69 of file usb_host_hub.h.

#define PORT_POWER   8

Definition at line 70 of file usb_host_hub.h.

Referenced by enumerate_hub_port_device(), and usb_host_task().

#define PORT_LOW_SPEED   9

Definition at line 71 of file usb_host_hub.h.

Referenced by hub_manage_port_change_status().

#define C_PORT_CONNECTION   16

Definition at line 72 of file usb_host_hub.h.

Referenced by hub_manage_port_change_status().

#define C_PORT_ENABLE   17

Definition at line 73 of file usb_host_hub.h.

#define C_PORT_SUSPEND   18

Definition at line 74 of file usb_host_hub.h.

Referenced by hub_manage_port_change_status().

#define C_PORT_OVER_CURRENT   19

Definition at line 75 of file usb_host_hub.h.

#define C_PORT_RESET   20

Definition at line 76 of file usb_host_hub.h.

Referenced by hub_manage_port_change_status().

#define PORT_TEST   21

Definition at line 77 of file usb_host_hub.h.

#define PORT_INDICATOR   22

Definition at line 78 of file usb_host_hub.h.

#define NB_PORT_OFFSET   2

Definition at line 81 of file usb_host_hub.h.

Referenced by enumerate_hub_port_device(), and usb_host_task().

#define HUB_DEVICE_POWERED   2

Definition at line 84 of file usb_host_hub.h.

Referenced by enumerate_hub_port_device(), hub_init(), hub_manage_port_change_status(), and remove_device_entry().

#define HUB_DEVICE_CONNECT   3

Definition at line 85 of file usb_host_hub.h.

#define HUB_DEVICE_WAIT_RST_1   4

Definition at line 86 of file usb_host_hub.h.

Referenced by enumerate_hub_port_device().

#define HUB_DEVICE_WAIT_RST_2   5

Definition at line 87 of file usb_host_hub.h.

Referenced by enumerate_hub_port_device().

#define HUB_DEVICE_READY   6

Definition at line 88 of file usb_host_hub.h.

Referenced by enumerate_hub_port_device(), and hub_manage_port_change_status().

#define HUB_PORT_CONNECTION   0

Definition at line 91 of file usb_host_hub.h.

Referenced by enumerate_hub_port_device(), and hub_manage_port_change_status().

#define HUB_PORT_RESET   1

Definition at line 92 of file usb_host_hub.h.

Referenced by enumerate_hub_port_device(), and hub_manage_port_change_status().

#define HUB_PORT_DISCONNECT   2

Definition at line 93 of file usb_host_hub.h.

Referenced by enumerate_hub_port_device(), and hub_manage_port_change_status().

#define Clear_hub_feature ( feature_selector   ) 

Value:

Clear_hub_feature.

this function send a Clear_hub_feature request

Parameters:
U8 feature_selector
Returns:
status

Definition at line 117 of file usb_host_hub.h.

#define Clear_port_feature ( feature_selector,
port   ) 

Value:

Clear_port_feature.

this function send a Clear port feature request

Parameters:
U8 feature_selector
U8 port
Returns:
status

Definition at line 135 of file usb_host_hub.h.

Referenced by hub_manage_port_change_status().

 
#define Get_hub_descriptor (  ) 

Value:

Get_hub_descriptor.

this function send a get hub dscriptor request

Returns:
status

Definition at line 150 of file usb_host_hub.h.

Referenced by enumerate_hub_port_device(), and usb_host_task().

 
#define Get_hub_status (  ) 

Value:

Get_hub_status.

this function send a get hub status request

Returns:
status

Definition at line 165 of file usb_host_hub.h.

#define Get_port_status ( port   ) 

Value:

Get_port_status.

this function send a get port status request

Parameters:
U8 port
Returns:
status

Definition at line 181 of file usb_host_hub.h.

Referenced by get_port_status().

#define Set_hub_feature ( feature   ) 

Value:

Set_hub_feature.

this function send a set hub feature request

Parameters:
U8 feature_selector
Returns:
status

Definition at line 199 of file usb_host_hub.h.

#define Set_port_feature ( feature,
port   ) 

Value:

Set_port_feature.

this function send a set port feature request

Parameters:
U8 feature_selector
U8 port
Returns:
status

Definition at line 218 of file usb_host_hub.h.

Referenced by enumerate_hub_port_device(), and usb_host_task().

#define Set_port_indicator_green ( i   )     Set_port_feature(PORT_INDICATOR,0x0200+i)

Definition at line 228 of file usb_host_hub.h.

#define Set_port_indicator_amber ( i   )     Set_port_feature(PORT_INDICATOR,0x0100+i)

Definition at line 229 of file usb_host_hub.h.

#define Set_port_indicator_auto ( i   )     Set_port_feature(PORT_INDICATOR,0x0300+i)

Definition at line 230 of file usb_host_hub.h.

#define Set_port_indicator_off ( i   )     Set_port_feature(PORT_INDICATOR,0x0000+i)

Definition at line 231 of file usb_host_hub.h.

#define Set_port_reset ( i   )     Set_port_feature(PORT_RESET,i)

Definition at line 233 of file usb_host_hub.h.

Referenced by enumerate_hub_port_device().

#define Set_port_suspend ( i   )     Set_port_feature(PORT_SUSPEND,i)

Definition at line 234 of file usb_host_hub.h.

#define Clear_port_suspend ( i   )     Clear_port_feature(PORT_SUSPEND,i)

Definition at line 235 of file usb_host_hub.h.

#define Set_port_power ( i   )     Set_port_feature(PORT_POWER,i);

Definition at line 237 of file usb_host_hub.h.

#define Clear_port_power ( i   )     Clear_port_feature(PORT_POWER,i);

Definition at line 238 of file usb_host_hub.h.


Function Documentation

U32 get_port_status ( U8  port_number  ) 

This function returns the status of the specified usb hub port

Parameters:
U8 port_number
Returns:
status

Definition at line 111 of file usb_host_hub.c.

References data_stage, Get_port_status, LSB0, LSB1, LSB2, and LSB3.

00112 {
00113    U32 to_return;
00114    
00115    Get_port_status(port_number);
00116    LSB3(to_return)=data_stage[3];
00117    LSB2(to_return)=data_stage[2];
00118    LSB1(to_return)=data_stage[1];
00119    LSB0(to_return)=data_stage[0];
00120    return to_return;
00121 }

void hub_manage_port_change_status ( U8  port_change_status,
U8  hub_number 
)

This function decodes the change status repport from the hub interrupt pipe.

The function decodes hub port event and call the "enumerate_hub_port_device" function to manage the enumeration of the device connected to the hub port.

Parameters:
U8 port_change_status
U8 hub_number the number of the hub taht detects the event
Returns:
void

Definition at line 137 of file usb_host_hub.c.

References c, C_PORT_CONNECTION, C_PORT_RESET, C_PORT_SUSPEND, Clear_port_feature, enumerate_hub_port_device(), get_port_status(), HUB_DEVICE_POWERED, HUB_DEVICE_READY, HUB_MAX_NB_PORT, HUB_PORT_CONNECTION, HUB_PORT_DISCONNECT, HUB_PORT_RESET, hub_port_state, i, PORT_CONNECTION, PORT_LOW_SPEED, and USB_MAX_HUB_NUMBER.

00138 {
00139    U8 i,c;
00140    U32 port_status;
00141    U8 port_addr_0_in_use=0;
00142    
00143    // There should be one and only one device on the bus responding to device address 0
00144    // Look in the hub_port_state state machine if one device is currently using this address
00145    // If another hub is currently using address zero, the function returns imediately
00146    for(i=0;i<USB_MAX_HUB_NUMBER;i++)
00147    {
00148       for(c=1;c<=HUB_MAX_NB_PORT;c++)
00149       {
00150          if((hub_port_state[i][c-1] != HUB_DEVICE_POWERED) && (hub_port_state[i][c-1] != HUB_DEVICE_READY))
00151          {
00152             //Found one port with one device using the address 0
00153             // memorize this port number
00154             if(i!=(hub_number-1)) 
00155             {  return; } //Other hub currently using address zero
00156             // ok the hub using the device address zero is the hub that currently generates the event (port_change_status)
00157             port_addr_0_in_use=c; 
00158             break;        
00159          }
00160       }
00161    }
00162    
00163    // For all ports 
00164    for(c=1;c<=HUB_MAX_NB_PORT;c++)
00165    {
00166       // One device connected to one port is using device address zero
00167       // Skip all other port activity management
00168       if((port_addr_0_in_use!=0) && (c!=port_addr_0_in_use) )
00169       {
00170          continue;
00171       }
00172       
00173       // Does this port generates port change status ?
00174       if(port_change_status & (1<<c))
00175       {
00176          // Get port status bytes
00177          port_status=get_port_status(c);
00178          // For each port event, send this event to the function that manage the 
00179          // state of the device connected to the hub port
00180          if( port_status & ((U32)1<<C_PORT_CONNECTION))
00181          {
00182             Clear_port_feature(C_PORT_CONNECTION,c);
00183             if(port_status&((U32)1<<PORT_CONNECTION))
00184             {
00185                // Port connection low speed -> Unsupported (no PRE token in current OTG interface implementation)
00186                if(port_status&((U32)1<<PORT_LOW_SPEED))
00187                {
00188 
00189                }
00190                else // Port Connection full speed : OK
00191                {
00192                   enumerate_hub_port_device(c,HUB_PORT_CONNECTION,hub_number);
00193                }
00194             }
00195             else
00196             {
00197                // Port disconnection
00198                enumerate_hub_port_device(c,HUB_PORT_DISCONNECT,hub_number);
00199             }
00200          }
00201          else if( port_status & ((U32)1<<C_PORT_SUSPEND))
00202          {
00203             // Port Suspend state
00204             Clear_port_feature(C_PORT_SUSPEND,c);
00205          }
00206          else if( port_status & ((U32)1<<C_PORT_RESET))
00207          {
00208             // Port Reset sent
00209             Clear_port_feature(C_PORT_RESET,c);
00210             enumerate_hub_port_device(c,HUB_PORT_RESET,hub_number);            
00211          }
00212       }
00213 
00214       // Previous port using device address zero abort all port device management  
00215       // (There should be one and only device with adddress zero on the USB tree)
00216       if((hub_port_state[hub_number-1][c-1] != HUB_DEVICE_POWERED) && (hub_port_state[hub_number-1][c-1] != HUB_DEVICE_READY))
00217       {
00218          break;  // Break port loop and exit from function      
00219       }
00220    }
00221 }

Here is the call graph for this function:

void enumerate_hub_port_device ( U8  hub_port,
U8  port_ev,
U8  hub_number 
)

Manage the enumeration process of the device connected to the hub port number specified

Parameters:
U8 hub_port: the usb hub downstream port number
U8 port_ev: the hub port event detected
Returns:
none

Definition at line 232 of file usb_host_hub.c.

References c, CONTROL_GOOD, data_stage, S_usb_tree::device, S_usb_device::device_address, DEVICE_BASE_ADDRESS, S_usb_device::ep_ctrl_size, EVT_HOST_SOF, f_hub_port_disconnect, Get_class, Get_hub_descriptor, host_auto_configure_endpoint(), host_check_class(), host_check_VID_PID(), Host_device_not_supported_action, Host_device_supported_action, HOST_FALSE, host_get_configuration_descriptor, host_get_device_descriptor, host_get_device_descriptor_uncomplete, Host_select_device, host_set_address, host_set_configuration, Host_set_device_supported, HOST_TRUE, HUB_CLASS, hub_device_address, HUB_DEVICE_POWERED, HUB_DEVICE_READY, HUB_DEVICE_WAIT_RST_1, HUB_DEVICE_WAIT_RST_2, hub_init(), HUB_PORT_CONNECTION, HUB_PORT_DISCONNECT, S_usb_device::hub_port_nb, HUB_PORT_RESET, hub_port_state, Is_host_emergency_exit, Is_usb_bconnection_error_interrupt, Is_usb_event, MAX_DEVICE_IN_USB_TREE, S_usb_tree::nb_device, nb_hub_present, NB_PORT_OFFSET, new_device_connected, OFFSET_FIELD_MAXPACKETSIZE, S_usb_device::parent_hub_number, PORT_POWER, remove_device_entry(), Set_port_feature, Set_port_reset, TRUE, Usb_ack_event, usb_tree, and User_configure_endpoint.

00233 {
00234    U8 device_index=0;
00235    U8 hub_device_index=0;
00236    U8 nb_port,c;
00237    
00238    // Find the device index of the hub_number
00239    for(c=0;c<MAX_DEVICE_IN_USB_TREE;c++)
00240    {
00241       if(usb_tree.device[c].device_address==hub_device_address[hub_number-1])
00242       {
00243          hub_device_index=c;         
00244       }
00245    }
00246    
00247    // Find the device index in linked to the specified hub port    
00248    // -> look in the usb_tree structure
00249    for(c=0;c<MAX_DEVICE_IN_USB_TREE;c++)
00250    {
00251       if((usb_tree.device[c].hub_port_nb == hub_port) && (usb_tree.device[c].parent_hub_number==hub_number))
00252       {
00253          device_index=c;
00254          break;
00255       }
00256    }
00257 
00258    // Port disconnection detected -> delete device entry and RAZ state machine
00259    // and return ...
00260    if(port_ev==HUB_PORT_DISCONNECT)
00261    {
00262       remove_device_entry(device_index);  // Remove device entry in usb tree
00263       usb_tree.nb_device--; 
00264       hub_port_state[hub_number-1][hub_port-1]=HUB_DEVICE_POWERED; // RAZ state machine 
00265       f_hub_port_disconnect = TRUE;   // Flag for device disconnection signaling
00266       return;
00267    }
00268    
00269    // Device enumeration state machine for hub port
00270    switch(hub_port_state[hub_number-1][hub_port-1])
00271    {
00272       // New device connection
00273       // -> Generate first USB reset for the device
00274       case HUB_DEVICE_POWERED:
00275          if(port_ev==HUB_PORT_CONNECTION)
00276          {
00277             device_index=usb_tree.nb_device++;
00278             usb_tree.device[device_index].hub_port_nb=hub_port;
00279             usb_tree.device[device_index].parent_hub_number=hub_number;
00280             Host_select_device(hub_device_index);
00281             Set_port_reset(hub_port);
00282             hub_port_state[hub_number-1][hub_port-1]=HUB_DEVICE_WAIT_RST_1;
00283          }
00284          break;
00285          
00286       // Wait First reset successfully generated then:
00287       // -> Get device descriptor to get endpoint zero lenght
00288       // -> Generate second USB reset for the device
00289       case HUB_DEVICE_WAIT_RST_1:
00290          if(port_ev==HUB_PORT_RESET)
00291          {
00292             c = 0;
00293             while (c<250)               // wait 250ms after USB reset
00294             {
00295                if (Is_usb_event(EVT_HOST_SOF)) { Usb_ack_event(EVT_HOST_SOF); c++; }// Count Start Of frame
00296                if (Is_host_emergency_exit() || Is_usb_bconnection_error_interrupt()) 
00297                {hub_port_state[hub_number-1][hub_port-1]=HUB_DEVICE_POWERED; return;}
00298             }
00299             Host_select_device(device_index);
00300             // By default assumes its ctrl endpoint is 8 bytes only
00301             usb_tree.device[device_index].ep_ctrl_size=8;
00302             // Get its device descriptor to get ctrl endpoint size 
00303             if( CONTROL_GOOD == host_get_device_descriptor_uncomplete())
00304             {
00305                Host_select_device(hub_device_index);
00306                usb_tree.device[device_index].ep_ctrl_size=data_stage[OFFSET_FIELD_MAXPACKETSIZE];
00307                Set_port_reset(hub_port);         // Second USB reset
00308                hub_port_state[hub_number-1][hub_port-1]=HUB_DEVICE_WAIT_RST_2;
00309             }
00310          }
00311          break;
00312 
00313       // Wait Second USB reset successfully generated then:
00314       // -> Enumerate the new device
00315       case HUB_DEVICE_WAIT_RST_2:
00316          if(port_ev==HUB_PORT_RESET)
00317          {
00318             c = 0;
00319             while (c<250)               // wait 250ms after USB reset
00320             {
00321                if (Is_usb_event(EVT_HOST_SOF)) { Usb_ack_event(EVT_HOST_SOF); c++; }// Count Start Of frame
00322                if (Is_host_emergency_exit() || Is_usb_bconnection_error_interrupt()) 
00323                {hub_port_state[hub_number-1][hub_port-1]=HUB_DEVICE_POWERED; return;}
00324             }
00325             // Select this new device
00326             Host_select_device(device_index);
00327 
00328             // Give an absolute device address
00329             host_set_address(DEVICE_BASE_ADDRESS+device_index);
00330             usb_tree.device[+device_index].device_address=DEVICE_BASE_ADDRESS+device_index;
00331 
00332             // Select this new address
00333             Host_select_device(device_index); 
00334 
00335             // Get the device descriptor 
00336             if (CONTROL_GOOD == host_get_device_descriptor())
00337             {
00338                // Check if the device connected belongs to the supported devices table
00339                if (HOST_TRUE == host_check_VID_PID())
00340                {
00341                   Host_set_device_supported();
00342                   Host_device_supported_action();
00343                }
00344                else
00345                {
00346                #if (HOST_STRICT_VID_PID_TABLE==ENABLE)
00347                   Host_device_not_supported_action();
00348                   return
00349                #endif
00350                }
00351                // Get Confiuration descriptor
00352                if (CONTROL_GOOD == host_get_configuration_descriptor())
00353                {
00354                   if (HOST_FALSE != host_check_class()) // Class support OK?
00355                   {
00356                   #if (HOST_AUTO_CFG_ENDPOINT==ENABLE)
00357                      if (host_auto_configure_endpoint())
00358                   #else
00359                      if(User_configure_endpoint()) // User call here instead of autoconfig
00360                   #endif
00361                      {
00362                         if (CONTROL_GOOD == host_set_configuration(1))  // Send Set_configuration
00363                         {
00364                            hub_port_state[hub_number-1][hub_port-1] = HUB_DEVICE_READY;
00365                             // Check if the connected device is a HUB
00366                            if(Get_class(0)==HUB_CLASS )
00367                            {
00368                                  // Get hub descriptor
00369                                  if( Get_hub_descriptor()==CONTROL_GOOD)
00370                                  {
00371                                     // Power each port of the hub
00372                                     nb_port=data_stage[NB_PORT_OFFSET];
00373                                     for(c=1;c<=nb_port;c++)
00374                                     {
00375                                        Set_port_feature(PORT_POWER,c);
00376                                     }
00377                                     nb_hub_present++;
00378                                     hub_init(nb_hub_present-1);
00379                                     hub_device_address[nb_hub_present-1]=usb_tree.device[device_index].device_address;
00380                                  }
00381                            }
00382                            else // New device is not a hub -> Signals device connection
00383                            {
00384                               new_device_connected=TRUE;
00385                            }
00386                         }
00387                      }
00388                   }
00389                }
00390             }
00391          }
00392          break;
00393          
00394       case HUB_DEVICE_READY:
00395          break;
00396       default:
00397          break;
00398    }
00399 }

Here is the call graph for this function:

void hub_init ( U8  hub_number  ) 

This function initializes the enumeration state machines for each hub port

Parameters:
U8 hub_number
Returns:
void

Definition at line 91 of file usb_host_hub.c.

References HUB_DEVICE_POWERED, HUB_MAX_NB_PORT, hub_port_state, and i.

00092 {
00093    U8 i;
00094 
00095    for(i=0;i<HUB_MAX_NB_PORT;i++)
00096    {
00097       hub_port_state[hub_number][i]=HUB_DEVICE_POWERED;
00098    }
00099 }


Variable Documentation

U8 f_hub_port_disconnect

Flag to store device connection event.

Definition at line 77 of file usb_host_hub.c.

U8 hub_device_address[USB_MAX_HUB_NUMBER]

Table to store the device address of the hub connected in the USB tree.

Definition at line 74 of file usb_host_hub.c.

U8 hub_port_state[USB_MAX_HUB_NUMBER][HUB_MAX_NB_PORT]

Enumeration state machine for each port of each hub.

Definition at line 71 of file usb_host_hub.c.

U8 nb_hub_present

The number of hub connected in the USB tree.

Definition at line 80 of file usb_host_hub.c.

U8 hub_device_address[USB_MAX_HUB_NUMBER]

Table to store the device address of the hub connected in the USB tree.

Definition at line 74 of file usb_host_hub.c.

U8 nb_hub_present

The number of hub connected in the USB tree.

Definition at line 80 of file usb_host_hub.c.


Generated on Wed Sep 23 09:17:16 2009 for ATMEL by  doxygen 1.5.3