libDaisy USB - Nim wrapper for USB functionality
This module provides Nim bindings for USB Device (CDC) and USB Host functionality in libDaisy. It supports USB CDC (Communication Device Class) for serial communication over USB, USB MIDI transport, and USB Host for Mass Storage Devices.
USB Device (CDC) Example:
import nimphea/hid/usb var usb = newUsbHandle() proc usbReceiveCallback(buffer: ptr uint8, len: ptr uint32) {.cdecl.} = echo "Received ", len[], " bytes" usb.init(FS_INTERNAL) usb.setReceiveCallback(usbReceiveCallback, FS_INTERNAL) var data = "Hello USB\n" discard usb.transmitInternal(cast[ptr uint8](addr data[0]), data.len.csize_t)
USB MIDI Transport Example:
import nimphea/hid/usb var midiUsb = newMidiUsbTransport() var config = MidiUsbTransportConfig() config.periph = MIDI_USB_INTERNAL config.txRetryCount = 3 proc midiRxCallback(data: ptr uint8, size: csize_t, context: pointer) {.cdecl.} = echo "Received MIDI data: ", size, " bytes" midiUsb.init(config) midiUsb.startRx(midiRxCallback, nil)
USB Host Example:
import nimphea/hid/usb var usbHost = newUSBHostHandle() var config = USBHostConfig() proc onConnect(data: pointer) {.cdecl.} = echo "USB device connected" proc onDisconnect(data: pointer) {.cdecl.} = echo "USB device disconnected" proc onClassActive(data: pointer) {.cdecl.} = echo "USB class initialized" config.connectCallback = onConnect config.disconnectCallback = onDisconnect config.classActiveCallback = onClassActive discard usbHost.init(config) while true: discard usbHost.process() if usbHost.getReady(): echo "USB Host ready: ", usbHost.getProductName()
Types
MidiRxParseCallback = proc (data: ptr uint8; size: csize_t; context: pointer) {. cdecl.}
- Source Edit
MidiUsbPeriph {.importcpp: "daisy::MidiUsbTransport::Config::Periph", size: 4.} = enum MIDI_USB_INTERNAL = 0, MIDI_USB_EXTERNAL, MIDI_USB_HOST
- Source Edit
MidiUsbTransport {.importcpp: "daisy::MidiUsbTransport".} = object
- Source Edit
MidiUsbTransportConfig {.importcpp: "daisy::MidiUsbTransport::Config".} = object periph* {.importc: "periph".}: MidiUsbPeriph txRetryCount* {.importc: "tx_retry_count".}: uint8
- Source Edit
USBHClassTypeDef {.importcpp: "USBH_ClassTypeDef".} = object
- Source Edit
USBHostClassActiveCallback = proc (userdata: pointer) {.cdecl.}
- Source Edit
USBHostConfig {.importcpp: "daisy::USBHostHandle::Config".} = object connectCallback* {.importc: "connect_callback".}: USBHostConnectCallback disconnectCallback* {.importc: "disconnect_callback".}: USBHostDisconnectCallback classActiveCallback* {.importc: "class_active_callback".}: USBHostClassActiveCallback errorCallback* {.importc: "error_callback".}: USBHostErrorCallback userdata* {.importc: "userdata".}: pointer
- Source Edit
USBHostConnectCallback = proc (data: pointer) {.cdecl.}
- Source Edit
USBHostDisconnectCallback = proc (data: pointer) {.cdecl.}
- Source Edit
USBHostErrorCallback = proc (data: pointer) {.cdecl.}
- Source Edit
USBHostHandle {.importcpp: "daisy::USBHostHandle".} = object
- Source Edit
USBHostResult {.importcpp: "daisy::USBHostHandle::Result", size: 4.} = enum USBH_OK = 0, USBH_BUSY, USBH_FAIL, USBH_NOT_SUPPORTED, USBH_UNRECOVERED_ERROR, USBH_ERROR_SPEED_UNKNOWN
- Source Edit
UsbPeriph {.importcpp: "daisy::UsbHandle::UsbPeriph", size: 4.} = enum FS_INTERNAL = 0, ## Internal USB pin FS_EXTERNAL, ## External USB pins (D+ on Pin 38/GPIO32, D- on Pin 37/GPIO31) FS_BOTH ## Both internal and external
- Source Edit
UsbReceiveCallback = proc (buff: ptr uint8; len: ptr uint32) {.cdecl.}
- Source Edit
Procs
proc deinit(this: var USBHostHandle): USBHostResult {.importcpp: "#.Deinit()", header: "hid/usb_host.h", header: "hid/usb_host.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc flushRx(this: var MidiUsbTransport) {.importcpp: "#.FlushRx()", header: "hid/usb_midi.h", header: "hid/usb_midi.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc getPresent(this: var USBHostHandle): bool {.importcpp: "#.GetPresent()", header: "hid/usb_host.h", header: "hid/usb_host.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc getProductName(this: var USBHostHandle): cstring {. importcpp: "#.GetProductName()", header: "hid/usb_host.h", header: "hid/usb_host.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc getReady(this: var USBHostHandle): bool {.importcpp: "#.GetReady()", header: "hid/usb_host.h", header: "hid/usb_host.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc init(this: var MidiUsbTransport; config: MidiUsbTransportConfig) {. importcpp: "#.Init(@)", header: "hid/usb_midi.h", header: "hid/usb_midi.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc init(this: var UsbHandle; dev: UsbPeriph) {.importcpp: "#.Init(@)", header: "hid/usb.h", header: "hid/usb.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc init(this: var USBHostHandle; config: var USBHostConfig): USBHostResult {. importcpp: "#.Init(@)", header: "hid/usb_host.h", header: "hid/usb_host.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc isActiveClass(this: var USBHostHandle; usbClass: ptr USBHClassTypeDef): bool {. importcpp: "#.IsActiveClass(@)", header: "hid/usb_host.h", header: "hid/usb_host.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc isDeviceConnected(this: var USBHostHandle): bool {. importcpp: "#.IsDeviceConnected()", header: "hid/usb_host.h", header: "hid/usb_host.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc isPortEnabled(this: var USBHostHandle): bool {. importcpp: "#.IsPortEnabled()", header: "hid/usb_host.h", header: "hid/usb_host.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc newMidiUsbTransport(): MidiUsbTransport {. importcpp: "daisy::MidiUsbTransport()", constructor, header: "hid/usb_midi.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc newMidiUsbTransportConfig(): MidiUsbTransportConfig {. importcpp: "daisy::MidiUsbTransport::Config()", constructor, header: "hid/usb_midi.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc newUsbHandle(): UsbHandle {.importcpp: "daisy::UsbHandle()", constructor, header: "hid/usb.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc newUSBHostConfig(): USBHostConfig {. importcpp: "daisy::USBHostHandle::Config()", constructor, header: "hid/usb_host.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc newUSBHostHandle(): USBHostHandle {.importcpp: "daisy::USBHostHandle()", constructor, header: "hid/usb_host.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc process(this: var USBHostHandle): USBHostResult {.importcpp: "#.Process()", header: "hid/usb_host.h", header: "hid/usb_host.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc reEnumerate(this: var USBHostHandle): USBHostResult {. importcpp: "#.ReEnumerate()", header: "hid/usb_host.h", header: "hid/usb_host.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc registerClass(this: var USBHostHandle; pClass: ptr USBHClassTypeDef): USBHostResult {. importcpp: "#.RegisterClass(@)", header: "hid/usb_host.h", header: "hid/usb_host.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc rxActive(this: var MidiUsbTransport): bool {.importcpp: "#.RxActive()", header: "hid/usb_midi.h", header: "hid/usb_midi.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc setReceiveCallback(this: var UsbHandle; cb: UsbReceiveCallback; dev: UsbPeriph) {.importcpp: "#.SetReceiveCallback(@)", header: "hid/usb.h", header: "hid/usb.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc startRx(this: var MidiUsbTransport; callback: MidiRxParseCallback; context: pointer) {.importcpp: "#.StartRx(@)", header: "hid/usb_midi.h", header: "hid/usb_midi.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc transmitExternal(this: var UsbHandle; buff: ptr uint8; size: csize_t): UsbResult {. importcpp: "#.TransmitExternal(@)", header: "hid/usb.h", header: "hid/usb.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc transmitExternal(this: var UsbHandle; data: cstring): UsbResult {. ...raises: [], tags: [], forbids: [].}
- Transmit a C string via external USB Source Edit
proc transmitExternal(this: var UsbHandle; data: openArray[byte]): UsbResult {. ...raises: [], tags: [], forbids: [].}
- Transmit a byte array via external USB Source Edit
proc transmitInternal(this: var UsbHandle; buff: ptr uint8; size: csize_t): UsbResult {. importcpp: "#.TransmitInternal(@)", header: "hid/usb.h", header: "hid/usb.h", ...raises: [], tags: [], forbids: [].}
- Source Edit
proc transmitInternal(this: var UsbHandle; data: cstring): UsbResult {. ...raises: [], tags: [], forbids: [].}
- Transmit a C string via internal USB Source Edit
proc transmitInternal(this: var UsbHandle; data: openArray[byte]): UsbResult {. ...raises: [], tags: [], forbids: [].}
- Transmit a byte array via internal USB Source Edit
proc tx(this: var MidiUsbTransport; buffer: openArray[byte]) {....raises: [], tags: [], forbids: [].}
- Transmit MIDI data from a byte array Source Edit
proc tx(this: var MidiUsbTransport; buffer: ptr uint8; size: csize_t) {. importcpp: "#.Tx(@)", header: "hid/usb_midi.h", header: "hid/usb_midi.h", ...raises: [], tags: [], forbids: [].}
- Source Edit