nimphea/hid/usb

Search:
Group by:
Source   Edit  

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  
UsbHandle {.importcpp: "daisy::UsbHandle".} = object
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  
UsbResult {.importcpp: "daisy::UsbHandle::Result", size: 4.} = enum
  USB_OK = 0, USB_ERR
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 deInit(this: var UsbHandle; dev: UsbPeriph) {.importcpp: "#.DeInit(@)",
    header: "hid/usb.h", header: "hid/usb.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