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"
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 |
user call-back functions
This file contains the user call-back functions corresponding to the application:
Definition in file usb_specific_request.c.
| 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();
}

| 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();
}

This function manages hid set idle request.
| 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());
}

| void usb_hid_get_idle | ( | U8 | u8_report_id ) |
This function manages hid get idle request.
| 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();
}

| 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();
}

This function checks the specific request and if known then processes it
| type | corresponding at bmRequestType (see USB specification) |
| request | corresponding at bRequest (see USB specification) |
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
}


| void usb_user_endpoint_init | ( | U8 | conf_nb ) |
This function configures the endpoints.
| 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);
}

This function returns the interface alternate setting.
| wInterface | Interface selected |
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
}

This function selects (and resets) the interface alternate setting.
| 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();
}
}

This function fills the global descriptor.
| type | corresponding at MSB of wValue (see USB specification) |
| string | corresponding at LSB of wValue (see USB specification) |
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;
}

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().
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().
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().
1.7.2