Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

usb: unify handling of length parameters #177

Merged
merged 3 commits into from
Feb 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions board-support/raspberrypi-rp2040/src/hal/usb.zig
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ pub const utf8ToUtf16Le = usb.utf8Toutf16Le;

pub var EP0_OUT_CFG: usb.EndpointConfiguration = .{
.descriptor = &usb.EndpointDescriptor{
.length = @as(u8, @intCast(@sizeOf(usb.EndpointDescriptor))),
.descriptor_type = usb.DescType.Endpoint,
.endpoint_address = usb.EP0_OUT_ADDR,
.attributes = @intFromEnum(usb.TransferType.Control),
Expand All @@ -57,7 +56,6 @@ pub var EP0_OUT_CFG: usb.EndpointConfiguration = .{

pub var EP0_IN_CFG: usb.EndpointConfiguration = .{
.descriptor = &usb.EndpointDescriptor{
.length = @as(u8, @intCast(@sizeOf(usb.EndpointDescriptor))),
.descriptor_type = usb.DescType.Endpoint,
.endpoint_address = usb.EP0_IN_ADDR,
.attributes = @intFromEnum(usb.TransferType.Control),
Expand Down
32 changes: 10 additions & 22 deletions core/src/core/usb.zig
Original file line number Diff line number Diff line change
Expand Up @@ -511,9 +511,7 @@ pub const Dir = enum(u8) {
};

/// Describes an endpoint within an interface
pub const EndpointDescriptor = extern struct {
/// Length of this struct, must be 7.
length: u8,
pub const EndpointDescriptor = struct {
/// Type of this descriptor, must be `Endpoint`.
descriptor_type: DescType,
/// Address of this endpoint, where the bottom 4 bits give the endpoint
Expand All @@ -530,7 +528,7 @@ pub const EndpointDescriptor = extern struct {

pub fn serialize(self: *const @This()) [7]u8 {
var out: [7]u8 = undefined;
out[0] = 7; // length
out[0] = out.len;
out[1] = @intFromEnum(self.descriptor_type);
out[2] = self.endpoint_address;
out[3] = self.attributes;
Expand All @@ -542,9 +540,7 @@ pub const EndpointDescriptor = extern struct {
};

/// Description of an interface within a configuration.
pub const InterfaceDescriptor = extern struct {
/// Length of this structure, must be 9.
length: u8,
pub const InterfaceDescriptor = struct {
/// Type of this descriptor, must be `Interface`.
descriptor_type: DescType,
/// ID of this interface.
Expand All @@ -566,7 +562,7 @@ pub const InterfaceDescriptor = extern struct {

pub fn serialize(self: *const @This()) [9]u8 {
var out: [9]u8 = undefined;
out[0] = 9; // length
out[0] = out.len;
out[1] = @intFromEnum(self.descriptor_type);
out[2] = self.interface_number;
out[3] = self.alternate_setting;
Expand All @@ -580,9 +576,7 @@ pub const InterfaceDescriptor = extern struct {
};

/// Description of a single available device configuration.
pub const ConfigurationDescriptor = extern struct {
/// Length of this structure, must be 9.
length: u8,
pub const ConfigurationDescriptor = struct {
/// Type of this descriptor, must be `Config`.
descriptor_type: DescType,
/// Total length of all descriptors in this configuration, concatenated.
Expand Down Expand Up @@ -610,7 +604,7 @@ pub const ConfigurationDescriptor = extern struct {

pub fn serialize(self: *const @This()) [9]u8 {
var out: [9]u8 = undefined;
out[0] = 9; // length
out[0] = out.len;
out[1] = @intFromEnum(self.descriptor_type);
out[2] = @intCast(self.total_length & 0xff);
out[3] = @intCast((self.total_length >> 8) & 0xff);
Expand All @@ -625,9 +619,7 @@ pub const ConfigurationDescriptor = extern struct {

/// Describes a device. This is the most broad description in USB and is
/// typically the first thing the host asks for.
pub const DeviceDescriptor = extern struct {
/// Length of this structure, must be 18.
length: u8,
pub const DeviceDescriptor = struct {
/// Type of this descriptor, must be `Device`.
descriptor_type: DescType,
/// Version of the device descriptor / USB protocol, in binary-coded
Expand Down Expand Up @@ -658,7 +650,7 @@ pub const DeviceDescriptor = extern struct {

pub fn serialize(self: *const @This()) [18]u8 {
var out: [18]u8 = undefined;
out[0] = 18; // length
out[0] = out.len;
out[1] = @intFromEnum(self.descriptor_type);
out[2] = @intCast(self.bcd_usb & 0xff);
out[3] = @intCast((self.bcd_usb >> 8) & 0xff);
Expand All @@ -682,9 +674,7 @@ pub const DeviceDescriptor = extern struct {

/// USB Device Qualifier Descriptor
/// This descriptor is mostly the same as the DeviceDescriptor
pub const DeviceQualifierDescriptor = extern struct {
/// Length of this structure, must be 18.
length: u8 = 10,
pub const DeviceQualifierDescriptor = struct {
/// Type of this descriptor, must be `Device`.
descriptor_type: DescType = DescType.DeviceQualifier,
/// Version of the device descriptor / USB protocol, in binary-coded
Expand All @@ -705,7 +695,7 @@ pub const DeviceQualifierDescriptor = extern struct {

pub fn serialize(self: *const @This()) [10]u8 {
var out: [10]u8 = undefined;
out[0] = 10; // length
out[0] = out.len;
out[1] = @intFromEnum(self.descriptor_type);
out[2] = @intCast(self.bcd_usb & 0xff);
out[3] = @intCast((self.bcd_usb >> 8) & 0xff);
Expand All @@ -721,8 +711,6 @@ pub const DeviceQualifierDescriptor = extern struct {

/// Layout of an 8-byte USB SETUP packet.
pub const SetupPacket = extern struct {
/// Request type; in practice, this is always either OUT (host-to-device) or
/// IN (device-to-host), whose values are given in the `Dir` enum.
request_type: u8,
/// Request. Standard setup requests are in the `SetupRequest` enum.
/// Devices can extend this with additional types as long as they don't
Expand Down
5 changes: 2 additions & 3 deletions core/src/core/usb/hid.zig
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,7 @@ pub const DescType = enum(u8) {
};

/// USB HID descriptor
pub const HidDescriptor = extern struct {
length: u8 = 9,
pub const HidDescriptor = struct {
descriptor_type: DescType = DescType.Hid,
/// Numeric expression identifying the HID Class Specification release
bcd_hid: u16,
Expand All @@ -103,7 +102,7 @@ pub const HidDescriptor = extern struct {

pub fn serialize(self: *const @This()) [9]u8 {
var out: [9]u8 = undefined;
out[0] = 9; // length
out[0] = out.len;
out[1] = @intFromEnum(self.descriptor_type);
out[2] = @intCast(self.bcd_hid & 0xff);
out[3] = @intCast((self.bcd_hid >> 8) & 0xff);
Expand Down
9 changes: 3 additions & 6 deletions examples/raspberrypi-rp2040/src/usb_device.zig
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ fn ep1_out_callback(dc: *usb.DeviceConfiguration, data: []const u8) void {
// add your own endpoints to...
pub var EP1_OUT_CFG: usb.EndpointConfiguration = .{
.descriptor = &usb.EndpointDescriptor{
.length = @as(u8, @intCast(@sizeOf(usb.EndpointDescriptor))),
.descriptor_type = usb.DescType.Endpoint,
.endpoint_address = usb.Dir.Out.endpoint(1),
.attributes = @intFromEnum(usb.TransferType.Bulk),
Expand All @@ -55,7 +54,6 @@ pub var EP1_OUT_CFG: usb.EndpointConfiguration = .{

pub var EP1_IN_CFG: usb.EndpointConfiguration = .{
.descriptor = &usb.EndpointDescriptor{
.length = @as(u8, @intCast(@sizeOf(usb.EndpointDescriptor))),
.descriptor_type = usb.DescType.Endpoint,
.endpoint_address = usb.Dir.In.endpoint(1),
.attributes = @intFromEnum(usb.TransferType.Bulk),
Expand All @@ -73,7 +71,6 @@ pub var EP1_IN_CFG: usb.EndpointConfiguration = .{
// This is our device configuration
pub var DEVICE_CONFIGURATION: usb.DeviceConfiguration = .{
.device_descriptor = &.{
.length = @as(u8, @intCast(@sizeOf(usb.DeviceDescriptor))),
.descriptor_type = usb.DescType.Device,
.bcd_usb = 0x0110,
.device_class = 0,
Expand All @@ -89,7 +86,6 @@ pub var DEVICE_CONFIGURATION: usb.DeviceConfiguration = .{
.num_configurations = 1,
},
.interface_descriptor = &.{
.length = @as(u8, @intCast(@sizeOf(usb.InterfaceDescriptor))),
.descriptor_type = usb.DescType.Interface,
.interface_number = 0,
.alternate_setting = 0,
Expand All @@ -101,9 +97,10 @@ pub var DEVICE_CONFIGURATION: usb.DeviceConfiguration = .{
.interface_s = 0,
},
.config_descriptor = &.{
.length = @as(u8, @intCast(@sizeOf(usb.ConfigurationDescriptor))),
.descriptor_type = usb.DescType.Config,
.total_length = @as(u8, @intCast(@sizeOf(usb.ConfigurationDescriptor) + @sizeOf(usb.InterfaceDescriptor) + @sizeOf(usb.EndpointDescriptor) + @sizeOf(usb.EndpointDescriptor))),
// This is calculated via the sizes of underlying descriptors contained in this configuration.
// ConfigurationDescriptor(9) + InterfaceDescriptor(9) * 1 + EndpointDescriptor(8) * 2
.total_length = 34,
.num_interfaces = 1,
.configuration_value = 1,
.configuration_s = 0,
Expand Down
9 changes: 3 additions & 6 deletions examples/raspberrypi-rp2040/src/usb_hid.zig
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ fn ep1_out_callback(dc: *usb.DeviceConfiguration, data: []const u8) void {
// add your own endpoints to...
pub var EP1_OUT_CFG: usb.EndpointConfiguration = .{
.descriptor = &usb.EndpointDescriptor{
.length = @as(u8, @intCast(@sizeOf(usb.EndpointDescriptor))),
.descriptor_type = usb.DescType.Endpoint,
.endpoint_address = usb.Dir.Out.endpoint(1),
.attributes = @intFromEnum(usb.TransferType.Interrupt),
Expand All @@ -55,7 +54,6 @@ pub var EP1_OUT_CFG: usb.EndpointConfiguration = .{

pub var EP1_IN_CFG: usb.EndpointConfiguration = .{
.descriptor = &usb.EndpointDescriptor{
.length = @as(u8, @intCast(@sizeOf(usb.EndpointDescriptor))),
.descriptor_type = usb.DescType.Endpoint,
.endpoint_address = usb.Dir.In.endpoint(1),
.attributes = @intFromEnum(usb.TransferType.Interrupt),
Expand All @@ -73,7 +71,6 @@ pub var EP1_IN_CFG: usb.EndpointConfiguration = .{
// This is our device configuration
pub var DEVICE_CONFIGURATION: usb.DeviceConfiguration = .{
.device_descriptor = &.{
.length = @as(u8, @intCast(@sizeOf(usb.DeviceDescriptor))),
.descriptor_type = usb.DescType.Device,
.bcd_usb = 0x0200,
.device_class = 0,
Expand All @@ -91,7 +88,6 @@ pub var DEVICE_CONFIGURATION: usb.DeviceConfiguration = .{
.num_configurations = 1,
},
.interface_descriptor = &.{
.length = @as(u8, @intCast(@sizeOf(usb.InterfaceDescriptor))),
.descriptor_type = usb.DescType.Interface,
.interface_number = 0,
.alternate_setting = 0,
Expand All @@ -103,9 +99,10 @@ pub var DEVICE_CONFIGURATION: usb.DeviceConfiguration = .{
.interface_s = 0,
},
.config_descriptor = &.{
.length = @as(u8, @intCast(@sizeOf(usb.ConfigurationDescriptor))),
.descriptor_type = usb.DescType.Config,
.total_length = @as(u8, @intCast(@sizeOf(usb.ConfigurationDescriptor) + @sizeOf(usb.InterfaceDescriptor) + @sizeOf(usb.EndpointDescriptor) + @sizeOf(usb.EndpointDescriptor))),
// This is calculated via the sizes of underlying descriptors contained in this configuration.
// ConfigurationDescriptor(9) + InterfaceDescriptor(9) * 1 + EndpointDescriptor(8) * 2
.total_length = 34,
.num_interfaces = 1,
.configuration_value = 1,
.configuration_s = 0,
Expand Down