Functions | Variables

# usb_specific_request.c File Reference

user call-back functions More...

`#include "config.h"`
`#include "conf_usb.h"`
`#include "lib_mcu/usb/usb_drv.h"`
`#include "usb_descriptors.h"`
`#include "modules/usb/device_chap9/usb_standard_request.h"`
`#include "usb_specific_request.h"`
`#include "lib_mcu/flash/flash_drv.h"`
Include dependency graph for usb_specific_request.c:

Go to the source code of this file.

## Functions
void | hid_get_report_descriptor (void)
| This function manages hit get repport request.
void | usb_hid_set_report_ouput (void)
| This function manages hit set report request.
void | usb_hid_set_idle (U8 u8_report_id, U8 u8_duration)
| This function manages hid set idle request.
void | usb_hid_get_idle (U8 u8_report_id)
| This function manages hid get idle request.
void | hid_get_hid_descriptor (void)
| This function manages hid get hid descriptor request.
Bool | usb_user_read_request (U8 type, U8 request)
| This function checks the specific request and if known then processes it
void | usb_user_endpoint_init (U8 conf_nb)
| This function configures the endpoints.
U8 | usb_user_interface_get (U16 wInterface)
| This function returns the interface alternate setting.
void | usb_user_interface_reset (U16 wInterface, U8 alternate_setting)
| This function selects (and resets) the interface alternate setting.
Bool | usb_user_get_descriptor (U8 type, U8 string)
| This function fills the global descriptor.
## Variables
U8 code * | pbuffer
U8 | data_to_transfer
code S_usb_hid_report_descriptor_mouse | usb_hid_report_descriptor_mouse
U8 | g_u8_report_rate = 0

## Detailed Description

user call-back functions

This file contains the user call-back functions corresponding to the application:

- Compiler: IAR EWAVR and GNU GCC for AVR
- Supported devices: ATmega32U4

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

Definition in file usb_specific_request.c.

## Function Documentation

void hid_get_report_descriptor | ( | void | ) |

This function manages hit get repport request.

Definition at line 271 of file usb_specific_request.c.

References data_to_transfer, EP_CONTROL_LENGTH, FALSE, Is_usb_read_control_enabled, Is_usb_receive_out, LSB, MSB, pbuffer, S_usb_hid_report_descriptor_mouse::report, TRUE, Usb_ack_receive_out, Usb_ack_receive_setup, usb_hid_report_descriptor_mouse, Usb_read_byte, Usb_send_control_in, and Usb_write_byte.

Referenced by usb_user_read_request().

    {
       U16 wLength;
       U8  nb_byte;
       bit zlp = FALSE;
       U16 wInterface;

       LSB(wInterface)=Usb_read_byte();
       MSB(wInterface)=Usb_read_byte();

       data_to_transfer = sizeof(usb_hid_report_descriptor_mouse);
       pbuffer = &(usb_hid_report_descriptor_mouse.report[0]);

       LSB(wLength) = Usb_read_byte();
       MSB(wLength) = Usb_read_byte();
       Usb_ack_receive_setup();

       if (wLength > data_to_transfer)
       {
          if ((data_to_transfer % EP_CONTROL_LENGTH) == 0) { zlp = TRUE; }
          else { zlp = FALSE; }
       }
       else
       {
          data_to_transfer = (U8)wLength;           // send only requested number of data
       }

       while((data_to_transfer != 0) && (!Is_usb_receive_out()))
       {
          while(!Is_usb_read_control_enabled());

          nb_byte=0;
          while(data_to_transfer != 0)              // Send data until necessary
          {
             if(nb_byte++==EP_CONTROL_LENGTH)       // Check endpoint 0 size
             {
                break;
             }
    #ifndef __GNUC__
             Usb_write_byte(*pbuffer++);
    #else    // AVRGCC does not support point to PGM space
             Usb_write_byte(pgm_read_byte_near((unsigned int)pbuffer++));
    #endif
             data_to_transfer --;
          }
          Usb_send_control_in();
       }

       if(Is_usb_receive_out())
       {
          // abort from Host
          Usb_ack_receive_out();
          return;
       }
       if(zlp == TRUE)
       {
          while(!Is_usb_read_control_enabled());
          Usb_send_control_in();
       }

       while(!Is_usb_receive_out());
       Usb_ack_receive_out();
    }

Here is the caller graph for this function:

void usb_hid_set_report_ouput | ( | void | ) |

This function manages hit set report request.

Definition at line 338 of file usb_specific_request.c.

References Is_usb_receive_out, Usb_ack_receive_out, Usb_ack_receive_setup, and Usb_send_control_in.

Referenced by usb_user_read_request().

    {
       Usb_ack_receive_setup();
       Usb_send_control_in();

       while(!Is_usb_receive_out());
       Usb_ack_receive_out();
       Usb_send_control_in();
    }

Here is the caller graph for this function:

void usb_hid_set_idle | ( | U8 | u8_report_id,
|  | U8 | u8_duration
| ) |  |

This function manages hid set idle request.

Parameters:

  Duration | When the upper byte of wValue is 0 (zero), the duration is indefinite else from 0.004 to 1.020 seconds
  Report | ID 0 the idle rate applies to all input reports, else only applies to the Report ID

Definition at line 354 of file usb_specific_request.c.

References g_u8_report_rate, Is_usb_in_ready, LSB, MSB, Usb_ack_receive_setup, Usb_read_byte, and Usb_send_control_in.

Referenced by usb_user_read_request().

    {
       U16 wInterface;

       // Get interface number to put in idle mode
       LSB(wInterface)=Usb_read_byte();
       MSB(wInterface)=Usb_read_byte();
       Usb_ack_receive_setup();

       g_u8_report_rate = u8_duration;

       Usb_send_control_in();
       while(!Is_usb_in_ready());
    }

Here is the caller graph for this function:

void usb_hid_get_idle | ( | U8 | u8_report_id ) |

This function manages hid get idle request.

Parameters:

  Report | ID 0 the idle rate applies to all input reports, else only applies to the Report ID

Definition at line 374 of file usb_specific_request.c.

References g_u8_report_rate, Is_usb_receive_out, LSB, MSB, Usb_ack_receive_out, Usb_ack_receive_setup, Usb_read_byte, Usb_send_control_in, and Usb_write_byte.

Referenced by usb_user_read_request().

    {
       U16 wLength;
       U16 wInterface;

       // Get interface number to put in idle mode
       LSB(wInterface)= Usb_read_byte();
       MSB(wInterface)= Usb_read_byte();
       LSB(wLength)   = Usb_read_byte();
       MSB(wLength)   = Usb_read_byte();
       Usb_ack_receive_setup();

       if( wLength != 0 )
       {
          Usb_write_byte(g_u8_report_rate);
          Usb_send_control_in();
       }

       while(!Is_usb_receive_out());
       Usb_ack_receive_out();
    }

Here is the caller graph for this function:

void hid_get_hid_descriptor | ( | void | ) |

This function manages hid get hid descriptor request.

Definition at line 399 of file usb_specific_request.c.

References S_usb_hid_descriptor::bLength, data_to_transfer, EP_CONTROL_LENGTH, FALSE, S_usb_user_configuration_descriptor::hid_mouse, Is_usb_read_control_enabled, Is_usb_receive_out, LSB, MSB, pbuffer, TRUE, Usb_ack_receive_out, Usb_ack_receive_setup, usb_conf_desc, Usb_read_byte, Usb_send_control_in, and Usb_write_byte.

Referenced by usb_user_read_request().

    {
       U16 wLength;
       U8  nb_byte;
       bit zlp=FALSE;
       U16 wInterface;

       LSB(wInterface)=Usb_read_byte();
       MSB(wInterface)=Usb_read_byte();

       data_to_transfer = sizeof(usb_conf_desc.hid_mouse);
       pbuffer = &(usb_conf_desc.hid_mouse.bLength);

       LSB(wLength) = Usb_read_byte();
       MSB(wLength) = Usb_read_byte();
       Usb_ack_receive_setup();

       if (wLength > data_to_transfer)
       {
          if ((data_to_transfer % EP_CONTROL_LENGTH) == 0) { zlp = TRUE; }
          else { zlp = FALSE; }                     // no need of zero length packet
       }
       else
       {
          data_to_transfer = (U8)wLength;           // send only requested number of data
       }

       while((data_to_transfer != 0) && (!Is_usb_receive_out()))
       {
          while(!Is_usb_read_control_enabled());

          nb_byte=0;
          while(data_to_transfer != 0)              // Send data until necessary
          {
             if(nb_byte++==EP_CONTROL_LENGTH)       // Check endpoint 0 size
             {
                break;
             }
    #ifndef __GNUC__
             Usb_write_byte(*pbuffer++);
    #else    // AVRGCC does not support point to PGM space
             Usb_write_byte(pgm_read_byte_near((unsigned int)pbuffer++));
    #endif
             data_to_transfer --;
          }
          Usb_send_control_in();
       }

       if(Is_usb_receive_out())
       {
          // abort from Host
          Usb_ack_receive_out();
          return;
       }
       if(zlp == TRUE)
       {
          while(!Is_usb_read_control_enabled());
          Usb_send_control_in();
       }

       while(!Is_usb_receive_out());
       Usb_ack_receive_out();
    }

Here is the caller graph for this function:

Bool usb_user_read_request | ( | U8 | type,
|  | U8 | request
| ) |  |

This function checks the specific request and if known then processes it

Parameters:

  type | corresponding at bmRequestType (see USB specification)
  request | corresponding at bRequest (see USB specification)

Returns:
  TRUE, when the request is processed
  FALSE, if the request is'nt know (STALL handshake is managed by the main standard request function).

Definition at line 89 of file usb_specific_request.c.

References DESCRIPTOR_HID, DESCRIPTOR_PHYSICAL, DESCRIPTOR_REPORT, FALSE, hid_get_hid_descriptor(), hid_get_report_descriptor(), REPORT_TYPE_FEATURE, REPORT_TYPE_INPUT, REPORT_TYPE_OUTPUT, SETUP_GET_DESCRIPTOR, SETUP_HID_GET_IDLE, SETUP_HID_GET_PROTOCOL, SETUP_HID_GET_REPORT, SETUP_HID_SET_IDLE, SETUP_HID_SET_PROTOCOL, SETUP_HID_SET_REPORT, TRUE, usb_hid_get_idle(), usb_hid_set_idle(), usb_hid_set_report_ouput(), Usb_read_byte, USB_SETUP_GET_CLASS_INTER, USB_SETUP_GET_STAND_INTERFACE, and USB_SETUP_SET_CLASS_INTER.

Referenced by usb_process_request().

    {
       U8    wValue_msb;
       U8    wValue_lsb;

       // Read wValue
       wValue_lsb = Usb_read_byte();
       wValue_msb = Usb_read_byte();

       //** Specific request from Class HID
       if( USB_SETUP_GET_STAND_INTERFACE == type )
       {
          switch( request )
          {
             case SETUP_GET_DESCRIPTOR:
             switch( wValue_msb ) // Descriptor ID
             {
                case DESCRIPTOR_HID:
                hid_get_hid_descriptor();
                return TRUE;
                break;

                case DESCRIPTOR_REPORT:
                hid_get_report_descriptor();
                return TRUE;

                case DESCRIPTOR_PHYSICAL:
                // TODO
                break;
             }
             break;
          }
       }
       if( USB_SETUP_SET_CLASS_INTER == type )
       {
          switch( request )
          {
             case SETUP_HID_SET_REPORT:
             // The MSB wValue field specifies the Report Type
             // The LSB wValue field specifies the Report ID
             switch (wValue_msb)
             {
                case REPORT_TYPE_INPUT:
                // TODO
                break;

                case REPORT_TYPE_OUTPUT:
                usb_hid_set_report_ouput();
                return TRUE;
                break;

                case REPORT_TYPE_FEATURE:
                break;
             }
             break;

             case SETUP_HID_SET_IDLE:
             usb_hid_set_idle(wValue_lsb,wValue_msb);
             return TRUE;

             case SETUP_HID_SET_PROTOCOL:
             // TODO
             break;
          }
       }
       if( USB_SETUP_GET_CLASS_INTER == type )
       {
          switch( request )
          {
             case SETUP_HID_GET_REPORT:
             // TODO
             break;
             case SETUP_HID_GET_IDLE:
             usb_hid_get_idle(wValue_lsb);
             return TRUE;
             case SETUP_HID_GET_PROTOCOL:
             // TODO
             break;
          }
       }
       return FALSE;  // No supported request
    }

Here is the call graph for this function:

Here is the caller graph for this function:

void usb_user_endpoint_init | ( | U8 | conf_nb ) |

This function configures the endpoints.

Parameters:

  conf_nb | configuration number choosed by USB host

Definition at line 177 of file usb_specific_request.c.

References DIRECTION_IN, EP_MOUSE_IN, NYET_ENABLED, ONE_BANK, SIZE_8, TYPE_INTERRUPT, and usb_configure_endpoint.

Referenced by usb_set_configuration().

    {
       usb_configure_endpoint( EP_MOUSE_IN,   \
                               TYPE_INTERRUPT,\
                               DIRECTION_IN,  \
                               SIZE_8,        \
                               ONE_BANK,      \
                               NYET_ENABLED);
    }

Here is the caller graph for this function:

U8 usb_user_interface_get | ( | U16 | wInterface ) |

This function returns the interface alternate setting.

Parameters:

  wInterface | Interface selected

Returns:
  alternate setting configurated

Definition at line 194 of file usb_specific_request.c.

Referenced by usb_get_interface().

    {
       return 0;  // Only one alternate setting possible for all interface
    }

Here is the caller graph for this function:

void usb_user_interface_reset | ( | U16 | wInterface,
|  | U8 | alternate_setting
| ) |  |

This function selects (and resets) the interface alternate setting.

Parameters:

  wInterface | Interface selected
  alternate_setting | alternate setting selected

Definition at line 205 of file usb_specific_request.c.

References EP_MOUSE_IN, INTERFACE_NB_MOUSE, Usb_disable_stall_handshake, Usb_reset_data_toggle, Usb_reset_endpoint, and Usb_select_endpoint.

Referenced by usb_set_interface().

    {
       // default setting selected = reset data toggle
       if( INTERFACE_NB_MOUSE == wInterface )
       {
          // Interface mouse
          Usb_select_endpoint(EP_MOUSE_IN);
          Usb_disable_stall_handshake();
          Usb_reset_endpoint(EP_MOUSE_IN);
          Usb_reset_data_toggle();
       }
    }

Here is the caller graph for this function:

Bool usb_user_get_descriptor | ( | U8 | type,
|  | U8 | string
| ) |  |

This function fills the global descriptor.

Parameters:

  type | corresponding at MSB of wValue (see USB specification)
  string | corresponding at LSB of wValue (see USB specification)

Returns:
  FALSE, if the global descriptor no filled

Definition at line 226 of file usb_specific_request.c.

References S_usb_serial_number::bLength, S_usb_product_string_descriptor::bLength, S_usb_manufacturer_string_descriptor::bLength, S_usb_language_id::bLength, data_to_transfer, DESCRIPTOR_STRING, FALSE, LANG_ID, MAN_INDEX, pbuffer, PROD_INDEX, SN_INDEX, SN_LENGTH, TRUE, usb_user_language_id, usb_user_manufacturer_string_descriptor, usb_user_product_string_descriptor, and usb_user_serial_number.

Referenced by usb_get_descriptor().

    {
       switch(type)
       {
          case DESCRIPTOR_STRING:
          switch (string)
          {
             case LANG_ID:
             data_to_transfer = sizeof (usb_user_language_id);
             pbuffer = &(usb_user_language_id.bLength);
             return TRUE;
             break;

             case MAN_INDEX:
             data_to_transfer = sizeof (usb_user_manufacturer_string_descriptor);
             pbuffer = &(usb_user_manufacturer_string_descriptor.bLength);
             return TRUE;
             break;

             case PROD_INDEX:
             data_to_transfer = sizeof (usb_user_product_string_descriptor);
             pbuffer = &(usb_user_product_string_descriptor.bLength);
             return TRUE;
             break;

    #if (USB_DEVICE_SN_USE==ENABLE)
             case SN_INDEX:
             data_to_transfer = sizeof (usb_user_serial_number);
             pbuffer = &(usb_user_serial_number.bLength);
    #if (USE_DEVICE_SN_UNIQUE==ENABLE)
             f_get_serial_string=TRUE;
             data_to_transfer += (SN_LENGTH*4);
    #endif
             return TRUE;
             break;
    #endif
          }
          break;
       }
       return FALSE;
    }

Here is the caller graph for this function:

## Variable Documentation

U8 code* pbuffer

Definition at line 94 of file usb_standard_request.c.

Referenced by hid_get_hid_descriptor(), hid_get_report_descriptor(), usb_get_descriptor(), and usb_user_get_descriptor().

U8 data_to_transfer

Definition at line 99 of file usb_standard_request.c.

Referenced by hid_get_hid_descriptor(), hid_get_report_descriptor(), usb_get_descriptor(), and usb_user_get_descriptor().

code S_usb_hid_report_descriptor_mouse usb_hid_report_descriptor_mouse

Definition at line 172 of file usb_descriptors.c.

Referenced by hid_get_report_descriptor().

U8 g_u8_report_rate = 0

Definition at line 70 of file usb_specific_request.c.

Referenced by usb_hid_get_idle(), and usb_hid_set_idle().