use crate::descriptor::{
ClassSpecificDescriptor, ConfigurationDescriptor, ConfigurationDescriptorHeader,
DescriptorType, DeviceDescriptor, DeviceQualifierDescriptor, EndpointDescriptor,
InterfaceDescriptor, InterfaceDescriptorHeader, LanguageId, StringDescriptor,
StringDescriptorZero,
};
pub const VENDOR_ID: u16 = 0x1209; pub const PRODUCT_ID: u16 = 0x0001;
pub mod serial {
#[derive(Debug, PartialEq)]
#[repr(u8)]
pub enum ClassRequest {
SetLineCoding = 0x20, GetLineCoding = 0x21, SetControlLineState = 0x22, SendBreak = 0x23, Unknown(u8),
}
impl From<u8> for ClassRequest {
fn from(value: u8) -> Self {
match value {
0x20 => ClassRequest::SetLineCoding,
0x21 => ClassRequest::GetLineCoding,
0x22 => ClassRequest::SetControlLineState,
0x23 => ClassRequest::SendBreak,
_ => ClassRequest::Unknown(value),
}
}
}
}
pub const DEVICE_DESCRIPTOR: DeviceDescriptor = DeviceDescriptor {
bcdUSB: 0x0200,
bDeviceClass: 0x00, bDeviceSubClass: 0x00, bDeviceProtocol: 0x00,
bMaxPacketSize: 64,
idVendor: VENDOR_ID,
idProduct: PRODUCT_ID,
bcdDevice: 0x0001,
iManufacturer: 1,
iProduct: 2,
iSerialNumber: 3,
bNumConfigurations: 1,
..DeviceDescriptor::new()
};
pub const DEVICE_QUALIFIER_DESCRIPTOR: DeviceQualifierDescriptor = DeviceQualifierDescriptor {
bcdUSB: 0x0200,
bDeviceClass: 0x00,
bDeviceSubClass: 0x00,
bDeviceProtocol: 0x00,
bMaxPacketSize0: 8,
bNumConfigurations: 1,
bReserved: 0,
..DeviceQualifierDescriptor::new()
};
pub const CONFIGURATION_DESCRIPTOR_0: ConfigurationDescriptor = ConfigurationDescriptor::new(
ConfigurationDescriptorHeader {
bDescriptorType: DescriptorType::Configuration as u8,
bConfigurationValue: 1,
iConfiguration: 4,
bmAttributes: 0x80, bMaxPower: 50, ..ConfigurationDescriptorHeader::new()
},
&[
InterfaceDescriptor::new_cs(
InterfaceDescriptorHeader {
iInterfaceNumber: 0,
bAlternateSetting: 0,
bInterfaceClass: 0x02, bInterfaceSubClass: 0x02,
bInterfaceProtocol: 0x01,
iInterface: 5,
..InterfaceDescriptorHeader::new()
},
&[
ClassSpecificDescriptor {
bDescriptorSubtype: 0x00,
bmRaw: 0x0110,
..ClassSpecificDescriptor::new()
},
ClassSpecificDescriptor {
bDescriptorSubtype: 0x06,
bmRaw: 0x0100,
..ClassSpecificDescriptor::new()
},
ClassSpecificDescriptor {
bDescriptorSubtype: 0x01,
bmRaw: 0x0100,
..ClassSpecificDescriptor::new()
},
],
&[EndpointDescriptor {
bEndpointAddress: 0x83, bmAttributes: 0x03, wMaxPacketSize: 64,
bInterval: 11,
..EndpointDescriptor::new()
}],
),
InterfaceDescriptor::new(
InterfaceDescriptorHeader {
iInterfaceNumber: 1,
bAlternateSetting: 0,
bInterfaceClass: 0x0a, bInterfaceSubClass: 0x00, bInterfaceProtocol: 0x00,
iInterface: 6,
..InterfaceDescriptorHeader::new()
},
&[
EndpointDescriptor {
bEndpointAddress: 0x84, bmAttributes: 0x02, wMaxPacketSize: 64,
bInterval: 255,
..EndpointDescriptor::new()
},
EndpointDescriptor {
bEndpointAddress: 0x04, bmAttributes: 0x02, wMaxPacketSize: 512, bInterval: 255,
..EndpointDescriptor::new()
},
],
),
],
);
pub const OTHER_SPEED_CONFIGURATION_DESCRIPTOR_0: ConfigurationDescriptor =
ConfigurationDescriptor::new(
ConfigurationDescriptorHeader {
bDescriptorType: DescriptorType::Configuration as u8,
bConfigurationValue: 1,
iConfiguration: 4,
bmAttributes: 0x80, bMaxPower: 50, ..ConfigurationDescriptorHeader::new()
},
&[
InterfaceDescriptor::new_cs(
InterfaceDescriptorHeader {
iInterfaceNumber: 0,
bAlternateSetting: 0,
bInterfaceClass: 0x02, bInterfaceSubClass: 0x02,
bInterfaceProtocol: 0x01,
iInterface: 5,
..InterfaceDescriptorHeader::new()
},
&[
ClassSpecificDescriptor {
bDescriptorSubtype: 0x00,
bmRaw: 0x0110,
..ClassSpecificDescriptor::new()
},
ClassSpecificDescriptor {
bDescriptorSubtype: 0x06,
bmRaw: 0x0100,
..ClassSpecificDescriptor::new()
},
ClassSpecificDescriptor {
bDescriptorSubtype: 0x01,
bmRaw: 0x0100,
..ClassSpecificDescriptor::new()
},
],
&[EndpointDescriptor {
bEndpointAddress: 0x83, bmAttributes: 0x02, wMaxPacketSize: 64,
bInterval: 11,
..EndpointDescriptor::new()
}],
),
InterfaceDescriptor::new(
InterfaceDescriptorHeader {
iInterfaceNumber: 1,
bAlternateSetting: 0,
bInterfaceClass: 0x0a, bInterfaceSubClass: 0x00, bInterfaceProtocol: 0x00,
iInterface: 6,
..InterfaceDescriptorHeader::new()
},
&[
EndpointDescriptor {
bEndpointAddress: 0x84, bmAttributes: 0x02, wMaxPacketSize: 64,
bInterval: 255,
..EndpointDescriptor::new()
},
EndpointDescriptor {
bEndpointAddress: 0x04, bmAttributes: 0x02, wMaxPacketSize: 64,
bInterval: 255,
..EndpointDescriptor::new()
},
],
),
],
);
pub const STRING_DESCRIPTOR_0: StringDescriptorZero =
StringDescriptorZero::new(&[LanguageId::EnglishUnitedStates]);
pub const STRING_DESCRIPTOR_1: StringDescriptor = StringDescriptor::new("Cynthion Project");
pub const STRING_DESCRIPTOR_2: StringDescriptor = StringDescriptor::new("USB-to-serial");
pub const STRING_DESCRIPTOR_3: StringDescriptor = StringDescriptor::new("100");
pub const STRING_DESCRIPTOR_4: StringDescriptor = StringDescriptor::new("iConfiguration 0"); pub const STRING_DESCRIPTOR_5: StringDescriptor = StringDescriptor::new("iInterface 0"); pub const STRING_DESCRIPTOR_6: StringDescriptor = StringDescriptor::new("iInterface 1");
pub const STRING_DESCRIPTORS: &[&StringDescriptor] = &[
&STRING_DESCRIPTOR_1,
&STRING_DESCRIPTOR_2,
&STRING_DESCRIPTOR_3,
&STRING_DESCRIPTOR_4,
&STRING_DESCRIPTOR_5,
&STRING_DESCRIPTOR_6,
];