mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 21:07:35 +00:00
Kernel/USB: Add support for bulk transfers
This commit is contained in:
parent
6a3f959e92
commit
8a7876d65c
7 changed files with 80 additions and 0 deletions
|
@ -4,6 +4,7 @@
|
|||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <AK/StdLibExtras.h>
|
||||
#include <Kernel/Bus/USB/PacketTypes.h>
|
||||
#include <Kernel/Bus/USB/UHCI/UHCIController.h>
|
||||
#include <Kernel/Bus/USB/USBPipe.h>
|
||||
|
@ -71,4 +72,24 @@ ErrorOr<size_t> Pipe::control_transfer(u8 request_type, u8 request, u16 value, u
|
|||
return transfer_length;
|
||||
}
|
||||
|
||||
ErrorOr<size_t> Pipe::bulk_transfer(u16 length, void* data)
|
||||
{
|
||||
size_t transfer_length = 0;
|
||||
auto transfer = TRY(Transfer::try_create(*this, length));
|
||||
|
||||
if (m_direction == Direction::In) {
|
||||
dbgln_if(USB_DEBUG, "Pipe: Bulk in transfer allocated @ {}", transfer->buffer_physical());
|
||||
transfer_length = TRY(m_controller->submit_bulk_transfer(*transfer));
|
||||
memcpy(data, transfer->buffer().as_ptr(), min(length, transfer_length));
|
||||
dbgln_if(USB_DEBUG, "Pipe: Bulk in transfer complete!");
|
||||
} else if (m_direction == Direction::Out) {
|
||||
TRY(transfer->write_buffer(length, data));
|
||||
dbgln_if(USB_DEBUG, "Pipe: Bulk out transfer allocated @ {}", transfer->buffer_physical());
|
||||
transfer_length = TRY(m_controller->submit_bulk_transfer(*transfer));
|
||||
dbgln_if(USB_DEBUG, "Pipe: Bulk out transfer complete!");
|
||||
}
|
||||
|
||||
return transfer_length;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue