mirror of
https://github.com/eddyem/IR-controller.git
synced 2025-12-06 10:45:15 +03:00
235 lines
6.2 KiB
C
235 lines
6.2 KiB
C
/*
|
|
* usb_prop.c - USB init & properties
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
* MA 02110-1301, USA.
|
|
*/
|
|
|
|
#include "includes.h"
|
|
|
|
uint8_t Request = 0;
|
|
|
|
// USART line mode
|
|
LINE_CODING linecoding = {
|
|
115200, // baud rate
|
|
0x00, // stop bits-1
|
|
0x00, // parity - none
|
|
0x08 // no. of bits == 8
|
|
};
|
|
|
|
DEVICE Device_Table = {
|
|
EP_NUM, // total endpoints
|
|
1 // total configurations
|
|
};
|
|
|
|
// pointers to main functions
|
|
DEVICE_PROP Device_Property = {
|
|
SomeDev_init,
|
|
SomeDev_Reset,
|
|
SomeDev_Status_In,
|
|
SomeDev_Status_Out,
|
|
SomeDev_Data_Setup,
|
|
SomeDev_NoData_Setup,
|
|
SomeDev_Get_Interface_Setting,
|
|
SomeDev_GetDeviceDescriptor,
|
|
SomeDev_GetConfigDescriptor,
|
|
SomeDev_GetStringDescriptor,
|
|
0, // not used in this library version
|
|
SomeDev_DATA_SIZE // max packet size
|
|
};
|
|
|
|
|
|
// interface functions
|
|
USER_STANDARD_REQUESTS User_Standard_Requests = {
|
|
SomeDev_GetConfiguration,
|
|
SomeDev_SetConfiguration,
|
|
SomeDev_GetInterface,
|
|
SomeDev_SetInterface,
|
|
SomeDev_GetStatus,
|
|
SomeDev_ClearFeature,
|
|
SomeDev_SetEndPointFeature,
|
|
SomeDev_SetDeviceFeature,
|
|
SomeDev_SetDeviceAddress
|
|
};
|
|
|
|
ONE_DESCRIPTOR Device_Descriptor = {
|
|
(uint8_t*)SomeDev_DeviceDescriptor,
|
|
SomeDev_SIZ_DEVICE_DESC
|
|
};
|
|
|
|
ONE_DESCRIPTOR Config_Descriptor = {
|
|
(uint8_t*)SomeDev_ConfigDescriptor,
|
|
SomeDev_SIZ_CONFIG_DESC
|
|
};
|
|
|
|
ONE_DESCRIPTOR String_Descriptor[SomeDev_SIZ_STRINGS] = {
|
|
{(uint8_t*)SomeDev_StringLangID, SomeDev_SIZ_STRING_LANGID},
|
|
{(uint8_t*)SomeDev_StringVendor, SomeDev_SIZ_STRING_VENDOR},
|
|
{(uint8_t*)SomeDev_StringProduct, SomeDev_SIZ_STRING_PRODUCT},
|
|
{(uint8_t*)SomeDev_StringSerial, SomeDev_SIZ_STRING_SERIAL}
|
|
};
|
|
|
|
// Device init
|
|
void SomeDev_init(){
|
|
//Get_SerialNum();
|
|
pInformation->Current_Configuration = 0;
|
|
// power on
|
|
PowerOn();
|
|
// main initialisations taked from USB_SIL_Init();
|
|
_SetISTR(0);
|
|
wInterrupt_Mask = IMR_MSK;
|
|
_SetCNTR(wInterrupt_Mask);
|
|
// end of USB_SIL_Init()
|
|
bDeviceState = UNCONNECTED;
|
|
}
|
|
|
|
// Reset device
|
|
void SomeDev_Reset(){
|
|
pInformation->Current_Configuration = 0;
|
|
pInformation->Current_Feature = SomeDev_ConfigDescriptor[7];
|
|
// Set Virtual_Com_Port DEVICE with the default Interface
|
|
pInformation->Current_Interface = 0;
|
|
// endpoints initialisation
|
|
SetBTABLE(BTABLE_ADDRESS);
|
|
// EP0 - control
|
|
SetEPType(ENDP0, EP_CONTROL);
|
|
SetEPTxStatus(ENDP0, EP_TX_NAK);
|
|
SetEPRxAddr(ENDP0, ENDP0_RXADDR);
|
|
SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
|
|
SetEPTxAddr(ENDP0, ENDP0_TXADDR);
|
|
Clear_Status_Out(ENDP0);
|
|
SetEPRxValid(ENDP0);
|
|
// EP1 - data out
|
|
SetEPType(ENDP1, EP_BULK);
|
|
SetEPTxAddr(ENDP1, ENDP1_TXADDR);
|
|
SetEPTxStatus(ENDP1, EP_TX_NAK);
|
|
SetEPRxStatus(ENDP1, EP_RX_DIS);
|
|
// EP2 - interrupts to PC
|
|
SetEPType(ENDP2, EP_INTERRUPT);
|
|
SetEPTxAddr(ENDP2, ENDP2_TXADDR);
|
|
SetEPRxStatus(ENDP2, EP_RX_DIS);
|
|
SetEPTxStatus(ENDP2, EP_TX_NAK);
|
|
// EP3 - data in
|
|
SetEPType(ENDP3, EP_BULK);
|
|
SetEPRxAddr(ENDP3, ENDP3_RXADDR);
|
|
SetEPRxCount(ENDP3, SomeDev_DATA_SIZE);
|
|
SetEPRxStatus(ENDP3, EP_RX_VALID);
|
|
SetEPTxStatus(ENDP3, EP_TX_DIS);
|
|
// device address
|
|
SetDeviceAddress(0);
|
|
bDeviceState = ATTACHED;
|
|
}
|
|
|
|
// change configuration
|
|
void SomeDev_SetConfiguration(void){
|
|
if (pInformation->Current_Configuration != 0){
|
|
// device configured
|
|
bDeviceState = CONFIGURED;
|
|
// clear data toggle
|
|
// ClearDTOG_TX(ENDP1);
|
|
// ClearDTOG_RX(ENDP2);
|
|
}
|
|
}
|
|
|
|
// device addressed
|
|
void SomeDev_SetDeviceAddress (void){
|
|
bDeviceState = ADDRESSED;
|
|
}
|
|
|
|
void SomeDev_Status_In(void){
|
|
if (Request == SET_LINE_CODING)
|
|
Request = 0;
|
|
}
|
|
|
|
void SomeDev_Status_Out(void){
|
|
return;
|
|
}
|
|
|
|
// setup data interface (only set/get line coding)
|
|
RESULT SomeDev_Data_Setup(uint8_t RequestNo){
|
|
uint8_t *(*CopyRoutine)(uint16_t);
|
|
CopyRoutine = NULL;
|
|
if(RequestNo == GET_LINE_CODING){
|
|
if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
|
|
CopyRoutine = SomeDev_GetLineCoding;
|
|
}
|
|
else if (RequestNo == SET_LINE_CODING){
|
|
if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
|
|
CopyRoutine = SomeDev_SetLineCoding;
|
|
Request = SET_LINE_CODING;
|
|
}
|
|
if (CopyRoutine == NULL){
|
|
return USB_UNSUPPORT;
|
|
}
|
|
pInformation->Ctrl_Info.CopyData = CopyRoutine;
|
|
pInformation->Ctrl_Info.Usb_wOffset = 0;
|
|
(*CopyRoutine)(0);
|
|
return USB_SUCCESS;
|
|
}
|
|
|
|
|
|
// setup nodata
|
|
RESULT SomeDev_NoData_Setup(uint8_t RequestNo){
|
|
if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)){
|
|
if (RequestNo == SET_COMM_FEATURE)
|
|
return USB_SUCCESS;
|
|
else if (RequestNo == SET_CONTROL_LINE_STATE)
|
|
return USB_SUCCESS;
|
|
}
|
|
return USB_UNSUPPORT;
|
|
}
|
|
|
|
RESULT SomeDev_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting){
|
|
if (AlternateSetting > 0)
|
|
return USB_UNSUPPORT; // in this application we don't have AlternateSetting
|
|
else if (Interface > 0)
|
|
return USB_UNSUPPORT; // in this application we have only 1 interface
|
|
return USB_SUCCESS;
|
|
}
|
|
|
|
uint8_t *SomeDev_GetDeviceDescriptor(uint16_t Length){
|
|
return Standard_GetDescriptorData(Length, &Device_Descriptor );
|
|
}
|
|
|
|
uint8_t *SomeDev_GetConfigDescriptor(uint16_t Length){
|
|
return Standard_GetDescriptorData(Length, &Config_Descriptor );
|
|
}
|
|
|
|
uint8_t *SomeDev_GetStringDescriptor(uint16_t Length){
|
|
uint8_t wValue0 = pInformation->USBwValue0;
|
|
if (wValue0 > SomeDev_SIZ_STRINGS)
|
|
return NULL;
|
|
else
|
|
return Standard_GetDescriptorData(Length, &String_Descriptor[wValue0]);
|
|
}
|
|
|
|
uint8_t *SomeDev_GetLineCoding(uint16_t Length){
|
|
if (Length == 0){
|
|
pInformation->Ctrl_Info.Usb_wLength = sizeof(linecoding);
|
|
return NULL;
|
|
}
|
|
return(uint8_t *)&linecoding;
|
|
}
|
|
|
|
uint8_t *SomeDev_SetLineCoding(uint16_t Length){
|
|
if (Length == 0){
|
|
pInformation->Ctrl_Info.Usb_wLength = sizeof(linecoding);
|
|
return NULL;
|
|
}
|
|
// show current speed (we may reconfigure USART when this flag is set)
|
|
FLAGS |= FLAG_PRINTSPD;
|
|
return(uint8_t *)&linecoding;
|
|
}
|