Skip to content

Commit 0f5458b

Browse files
🐛 Enforce LE for all u16s put on the bus
1 parent 0442a62 commit 0f5458b

File tree

3 files changed

+28
-19
lines changed

3 files changed

+28
-19
lines changed

v5/conanfile.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def build_requirements(self):
6262
self.test_requires("boost-ext-ut/2.1.0")
6363

6464
def requirements(self):
65-
self.requires("libhal/[^4.18.1]", transitive_headers=True)
65+
self.requires("libhal/[^4.19.3]", transitive_headers=True)
6666

6767
def layout(self):
6868
cmake_layout(self)

v5/include/libhal-util/mock/usb.hpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ constexpr std::vector<hal::byte> pkt_to_scatter(setup_packet const& req)
4343
std::vector<byte> vec;
4444
vec.push_back(req.bm_request_type());
4545
vec.push_back(req.request());
46-
vec.append_range(setup_packet::to_le_u16(req.value()));
47-
vec.append_range(setup_packet::to_le_u16(req.index()));
48-
vec.append_range(setup_packet::to_le_u16(req.length()));
46+
vec.append_range(req.value_bytes());
47+
vec.append_range(req.index_bytes());
48+
vec.append_range(req.length_bytes());
4949

5050
return vec;
5151
}
@@ -369,7 +369,7 @@ class iad_mock : public interface
369369
safe_throw(hal::operation_not_supported(this));
370370
}
371371

372-
auto iface_idx = p_pkt.index() & 0xFF;
372+
auto iface_idx = p_pkt.index_bytes()[0];
373373

374374
if (iface_idx == m_iface_one.num) {
375375
return m_iface_one.num;
@@ -387,7 +387,7 @@ class iad_mock : public interface
387387
safe_throw(hal::operation_not_supported(this));
388388
}
389389

390-
auto iface_idx = p_pkt.index() & 0xFF;
390+
auto iface_idx = p_pkt.index_bytes()[0];
391391

392392
if (iface_idx == m_iface_one.num) {
393393
m_iface_one.feature = p_set;
@@ -400,7 +400,7 @@ class iad_mock : public interface
400400

401401
u8 driver_get_interface(setup_packet p_pkt)
402402
{
403-
auto iface_idx = p_pkt.index() & 0xFF;
403+
auto iface_idx = p_pkt.index_bytes()[0];
404404

405405
if (iface_idx == m_iface_one.num) {
406406
return m_iface_one.alt_settings;
@@ -413,7 +413,7 @@ class iad_mock : public interface
413413

414414
void driver_set_interface(setup_packet p_pkt)
415415
{
416-
auto iface_idx = p_pkt.index() & 0xFF;
416+
auto iface_idx = p_pkt.index_bytes()[0];
417417
auto alt_setting = p_pkt.value();
418418
if (iface_idx == m_iface_one.num) {
419419
m_iface_one.alt_settings = alt_setting;

v5/include/libhal-util/usb/enumerator.hpp

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -309,12 +309,11 @@ class enumerator
309309
if (req.get_type() == setup_packet::request_type::invalid) {
310310
return;
311311
}
312-
313312
if (determine_standard_request(req) ==
314313
standard_request_types::get_descriptor &&
315-
static_cast<descriptor_type>(req.value() >> 8 & 0xFF) ==
314+
static_cast<descriptor_type>(req.value_bytes()[1]) ==
316315
descriptor_type::string) {
317-
handle_str_descriptors(req.value() & 0xFF, req.length());
316+
handle_str_descriptors(req.value_bytes()[0], req.length());
318317

319318
} else if (req.get_recipient() == setup_packet::request_recipient::device) {
320319
try {
@@ -360,12 +359,21 @@ class enumerator
360359
}
361360

362361
private:
362+
u16 assemble_le_u16(std::span<byte const> bytes)
363+
{
364+
if (bytes.size() != 2) {
365+
throw hal::argument_out_of_domain(this);
366+
}
367+
368+
return static_cast<u16>(bytes[0]) | (static_cast<u16>(bytes[1]) << 8);
369+
}
370+
363371
void handle_standard_device_request(setup_packet& req)
364372
{
365373
switch (determine_standard_request(req)) {
366374
case standard_request_types::set_address: {
367375
m_ctrl_ep->write({});
368-
m_ctrl_ep->set_address(req.value());
376+
m_ctrl_ep->set_address(req.value_bytes()[0]);
369377

370378
break;
371379
}
@@ -398,18 +406,17 @@ class enumerator
398406

399407
void process_get_descriptor(setup_packet& req)
400408
{
401-
hal::byte desc_type = req.value() >> 8 & 0xFF;
402-
[[maybe_unused]] hal::byte desc_idx = req.value() & 0xFF;
403-
409+
hal::byte desc_type = req.value_bytes()[1];
410+
[[maybe_unused]] hal::byte desc_idx = req.value_bytes()[0];
404411
switch (static_cast<descriptor_type>(desc_type)) {
405412
case descriptor_type::device: {
406413
auto header =
407414
std::to_array({ constants::device_descriptor_size,
408415
static_cast<byte>(descriptor_type::device) });
409416
m_device->set_max_packet_size(
410417
static_cast<byte>(m_ctrl_ep->info().size));
411-
auto scatter_arr_pair =
412-
make_sub_scatter_bytes(req.length(), header, *m_device);
418+
auto scatter_arr_pair = make_sub_scatter_bytes(
419+
assemble_le_u16(req.length_bytes()), header, *m_device);
413420
hal::v5::write_and_flush(
414421
*m_ctrl_ep,
415422
scatter_span<byte const>(scatter_arr_pair.spans)
@@ -423,8 +430,10 @@ class enumerator
423430
auto conf_hdr =
424431
std::to_array({ constants::configuration_descriptor_size,
425432
static_cast<byte>(descriptor_type::configuration) });
426-
auto scatter_conf_pair = make_sub_scatter_bytes(
427-
req.length(), conf_hdr, static_cast<std::span<u8 const>>(conf));
433+
auto scatter_conf_pair =
434+
make_sub_scatter_bytes(assemble_le_u16(req.length_bytes()),
435+
conf_hdr,
436+
static_cast<std::span<u8 const>>(conf));
428437

429438
m_ctrl_ep->write(scatter_span<byte const>(scatter_conf_pair.spans)
430439
.first(scatter_conf_pair.count));

0 commit comments

Comments
 (0)