added isochronous modus
This commit is contained in:
@@ -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{}
|
||||
|
||||
Reference in New Issue
Block a user