133 lines
3.7 KiB
Go
133 lines
3.7 KiB
Go
|
// Copyright 2021 The Periph Authors. All rights reserved.
|
||
|
// Use of this source code is governed under the Apache License, Version 2.0
|
||
|
// that can be found in the LICENSE file.
|
||
|
|
||
|
package d2xx
|
||
|
|
||
|
import (
|
||
|
"strconv"
|
||
|
)
|
||
|
|
||
|
// Err is the error type returned by d2xx functions.
|
||
|
type Err int
|
||
|
|
||
|
// These are additional synthetic error codes.
|
||
|
const (
|
||
|
// NoCGO is returned when the package was compiled without cgo, thus the d2xx
|
||
|
// library is unavailable.
|
||
|
//
|
||
|
// This is never returned on Windows.
|
||
|
NoCGO Err = -2
|
||
|
// Missing is returned when the dynamic library is not available.
|
||
|
Missing Err = -1
|
||
|
)
|
||
|
|
||
|
// String converts a error integer to a string representation of the error.
|
||
|
func (e Err) String() string {
|
||
|
switch e {
|
||
|
case Missing:
|
||
|
// when the library d2xx couldn't be loaded at runtime.
|
||
|
return "couldn't load driver; visit https://periph.io/device/ftdi/ for help"
|
||
|
case NoCGO:
|
||
|
return "can't be used without cgo"
|
||
|
case 0: // FT_OK
|
||
|
return ""
|
||
|
case 1: // FT_INVALID_HANDLE
|
||
|
return "invalid handle"
|
||
|
case 2: // FT_DEVICE_NOT_FOUND
|
||
|
return "device not found; see https://periph.io/device/ftdi/ for help"
|
||
|
case 3: // FT_DEVICE_NOT_OPENED
|
||
|
return "device busy; see https://periph.io/device/ftdi/ for help"
|
||
|
case 4: // FT_IO_ERROR
|
||
|
return "I/O error"
|
||
|
case 5: // FT_INSUFFICIENT_RESOURCES
|
||
|
return "insufficient resources"
|
||
|
case 6: // FT_INVALID_PARAMETER
|
||
|
return "invalid parameter"
|
||
|
case 7: // FT_INVALID_BAUD_RATE
|
||
|
return "invalid baud rate"
|
||
|
case 8: // FT_DEVICE_NOT_OPENED_FOR_ERASE
|
||
|
return "device not opened for erase"
|
||
|
case 9: // FT_DEVICE_NOT_OPENED_FOR_WRITE
|
||
|
return "device not opened for write"
|
||
|
case 10: // FT_FAILED_TO_WRITE_DEVICE
|
||
|
return "failed to write device"
|
||
|
case 11: // FT_EEPROM_READ_FAILED
|
||
|
return "eeprom read failed"
|
||
|
case 12: // FT_EEPROM_WRITE_FAILED
|
||
|
return "eeprom write failed"
|
||
|
case 13: // FT_EEPROM_ERASE_FAILED
|
||
|
return "eeprom erase failed"
|
||
|
case 14: // FT_EEPROM_NOT_PRESENT
|
||
|
return "eeprom not present"
|
||
|
case 15: // FT_EEPROM_NOT_PROGRAMMED
|
||
|
return "eeprom not programmed"
|
||
|
case 16: // FT_INVALID_ARGS
|
||
|
return "invalid argument"
|
||
|
case 17: // FT_NOT_SUPPORTED
|
||
|
return "not supported"
|
||
|
case 18: // FT_OTHER_ERROR
|
||
|
return "other error"
|
||
|
case 19: // FT_DEVICE_LIST_NOT_READY
|
||
|
return "device list not ready"
|
||
|
default:
|
||
|
return "unknown status " + strconv.Itoa(int(e))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// unknown is a forward declaration of ftdi.DevType.
|
||
|
const unknown = 3
|
||
|
|
||
|
// handle is a d2xx handle.
|
||
|
//
|
||
|
// This is the base type which each OS specific implementation adds methods to.
|
||
|
type handle uintptr
|
||
|
|
||
|
// Handle is d2xx device handle.
|
||
|
type Handle interface {
|
||
|
Close() Err
|
||
|
// ResetDevice takes >1.2ms
|
||
|
ResetDevice() Err
|
||
|
GetDeviceInfo() (uint32, uint16, uint16, Err)
|
||
|
EEPROMRead(devType uint32, e *EEPROM) Err
|
||
|
EEPROMProgram(e *EEPROM) Err
|
||
|
EraseEE() Err
|
||
|
WriteEE(offset uint8, value uint16) Err
|
||
|
EEUASize() (int, Err)
|
||
|
EEUARead(ua []byte) Err
|
||
|
EEUAWrite(ua []byte) Err
|
||
|
SetChars(eventChar byte, eventEn bool, errorChar byte, errorEn bool) Err
|
||
|
SetUSBParameters(in, out int) Err
|
||
|
SetFlowControl() Err
|
||
|
SetTimeouts(readMS, writeMS int) Err
|
||
|
SetLatencyTimer(delayMS uint8) Err
|
||
|
SetBaudRate(hz uint32) Err
|
||
|
// GetQueueStatus takes >60µs
|
||
|
GetQueueStatus() (uint32, Err)
|
||
|
// Read takes <5µs if GetQueueStatus was called just before,
|
||
|
// 300µs~800µs otherwise (!)
|
||
|
Read(b []byte) (int, Err)
|
||
|
// Write takes >0.1ms
|
||
|
Write(b []byte) (int, Err)
|
||
|
GetBitMode() (byte, Err)
|
||
|
// SetBitMode takes >0.1ms
|
||
|
SetBitMode(mask, mode byte) Err
|
||
|
}
|
||
|
|
||
|
var _ Handle = handle(0)
|
||
|
|
||
|
// Version returns the library's version.
|
||
|
func Version() (uint8, uint8, uint8) {
|
||
|
return version()
|
||
|
}
|
||
|
|
||
|
// CreateDeviceInfoList discovers the currently found devices.
|
||
|
func CreateDeviceInfoList() (int, Err) {
|
||
|
return createDeviceInfoList()
|
||
|
}
|
||
|
|
||
|
// Open opens the ith device discovered.
|
||
|
func Open(i int) (Handle, Err) {
|
||
|
return open(i)
|
||
|
}
|