added isochronous modus

This commit is contained in:
2026-02-18 22:42:52 +01:00
parent 170f5dabcc
commit 99d9242264
7 changed files with 428 additions and 60 deletions
+50
View File
@@ -304,6 +304,56 @@ func BuildRetSubmit(seqNum, devID, direction, endpoint uint32, status int32, dat
return buf.Bytes(), nil
}
// BuildRetSubmitISO builds a RET_SUBMIT message for isochronous transfers.
// The transfer data must already be packed (compact, no gaps).
func BuildRetSubmitISO(seqNum, devID, direction, endpoint uint32, status int32,
packedData []byte, startFrame uint32, numPackets int32, errorCount int32,
isoDescs []ISOPacketDescriptor) ([]byte, error) {
buf := &bytes.Buffer{}
hdr := &URBHeader{
Command: RetSubmit,
SeqNum: seqNum,
DevID: devID,
Direction: direction,
Endpoint: endpoint,
}
if err := WriteURBHeader(buf, hdr); err != nil {
return nil, err
}
actualLen := uint32(0)
if direction == DirIn && packedData != nil {
actualLen = uint32(len(packedData))
}
body := &RetSubmitBody{
Status: status,
ActualLength: actualLen,
StartFrame: startFrame,
NumberOfPackets: uint32(numPackets),
ErrorCount: uint32(errorCount),
}
if err := WriteRetSubmit(buf, body); err != nil {
return nil, err
}
// Transfer buffer (packed) for IN direction
if direction == DirIn && len(packedData) > 0 {
buf.Write(packedData)
}
// ISO packet descriptors
for _, desc := range isoDescs {
if err := binary.Write(buf, binary.BigEndian, &desc); err != nil {
return nil, err
}
}
return buf.Bytes(), nil
}
// BuildRetUnlink builds a RET_UNLINK message
func BuildRetUnlink(seqNum, devID uint32, status int32) ([]byte, error) {
buf := &bytes.Buffer{}