63 строки
1,3 КиБ
Go
63 строки
1,3 КиБ
Go
package descriptor
|
|
|
|
import (
|
|
"runtime/volatile"
|
|
)
|
|
|
|
const (
|
|
TypeDevice = 0x1
|
|
TypeConfiguration = 0x2
|
|
TypeString = 0x3
|
|
TypeInterface = 0x4
|
|
TypeEndpoint = 0x5
|
|
TypeDeviceQualifier = 0x6
|
|
TypeInterfaceAssociation = 0xb
|
|
TypeClassHID = 0x21
|
|
TypeHIDReport = 0x22
|
|
TypeClassSpecific = 0x24
|
|
TypeClassSpecificEndpoint = 0x25
|
|
)
|
|
|
|
// DeviceDescBank is the USB device endpoint .
|
|
type DeviceDescBank struct {
|
|
ADDR volatile.Register32
|
|
PCKSIZE volatile.Register32
|
|
EXTREG volatile.Register16
|
|
STATUS_BK volatile.Register8
|
|
_reserved [5]volatile.Register8
|
|
}
|
|
|
|
type Device struct {
|
|
DeviceDescBank [2]DeviceDescBank
|
|
}
|
|
|
|
type Descriptor struct {
|
|
Device []byte
|
|
Configuration []byte
|
|
HID map[uint16][]byte
|
|
}
|
|
|
|
func (d *Descriptor) Configure(idVendor, idProduct uint16) {
|
|
dev := DeviceType{d.Device}
|
|
dev.VendorID(idVendor)
|
|
dev.ProductID(idProduct)
|
|
|
|
conf := ConfigurationType{d.Configuration}
|
|
conf.TotalLength(uint16(len(d.Configuration)))
|
|
}
|
|
|
|
func Append[T any](slices [][]T) []T {
|
|
var size, pos int
|
|
|
|
for _, s := range slices {
|
|
size += len(s)
|
|
}
|
|
|
|
result := make([]T, size)
|
|
|
|
for _, s := range slices {
|
|
pos += copy(result[pos:], s)
|
|
}
|
|
|
|
return result
|
|
}
|