completely refactor enumeration

parent 4df8f30f
-include Makefile.ftdi
OBJS = $(LIBNAME).o
OBJS = $(LIBNAME).o usb-enum.o
CFLAGS += -fPIC -g
CFLAGS += -DGIT_VERSION=\"$(GIT_VERSION)\"
GIT_VERSION = $(shell git describe --dirty --tags --all --long)
LIBNAME = liboasis-usb-att
all: lib testprog usb-enum
all: lib testprog
lib: $(LIBNAME).a $(LIBNAME).so
$(LIBNAME).a: $(OBJS)
ar rc $(LIBNAME).a $(OBJS)
$(LIBNAME).so: LDLIBS += -ludev
$(LIBNAME).so: $(OBJS)
$(CC) $(CFLAGS) -shared -o $@ $^ $(LDFLAGS) $(LDLIBS)
$(OBJS): liboasis-usb-att.h usb-enum.h
usb-enum: usb-enum.o
usb-enum: LDLIBS += -ludev
testprog: LDLIBS += -ludev
testprog: test.o $(LIBNAME).a
$(CC) $(CFLAGS) $^ -o $@ $(LDLIBS) $(LDFLAGS)
......
......@@ -8,9 +8,11 @@
#include <stdio.h>
#include <errno.h>
#include "liboasis-usb-att.h"
#include <ftdi.h>
#include "liboasis-usb-att.h"
#include "usb-enum.h"
#define OAU_VENDOR_ID 0x1556 /* CERN USB Vendor ID */
#define OAU_DEVICE_ID 0x0443 /* oau USB Device ID */
......@@ -38,7 +40,13 @@ static struct {
{ 6, 7 }
};
int oau_att_open(char *serial)
int oau_att_open(int lun)
{
/* not implemented: ignore lun by the moment */
return -ENOSYS;
}
int oau_att_open_by_serial(char *serial)
{
int ret;
......@@ -167,3 +175,17 @@ int oau_att_get_nchannels(int fd)
return OAU_NUM_CHANNELS;
}
int oau_list_devices(void)
{
int i, devs;
struct oau_devarray *list;
char vid[10], did[10];
sprintf(vid, "%04x", OAU_VENDOR_ID);
sprintf(did, "%04x", OAU_DEVICE_ID);
list = oau_get_devarray(vid, did);
oau_display_devarray(list);
return 0;
}
......@@ -32,6 +32,9 @@ enum oau_att_value_enum {
ATT_NONE = 0x0, /**< No attenuation */
ATT_1 = 0x01, /**< Attenuator 1: 20dB */
ATT_2 = 0x03, /**< Attenuator 1+2: 40dB */
ATT_MINUS_40dB = 0x0, /**< -40dB attn (power-on default) */
ATT_MINUS_20dB = 0x01, /**< -20dB attn */
ATT_0dB = 0x03, /**< 0dB attn */
};
/**
......@@ -40,11 +43,22 @@ enum oau_att_value_enum {
* A board is selected by lun, and a handle is returned for further
* reference to it.
*
* @param lun - logical unit number of USB attenuator
*
* @return >0 - on success, device file descriptor number
*/
int oau_att_open(int lun);
/**
* @brief Open a msatt device
*
* Open OASIS USB attenuator with given serial number.
*
* @param serial - serial number of USB attenuator
*
* @return >0 - on success, device file descriptor number
*/
int oau_att_open(char *serial);
int oau_att_open_by_serial(char *serial);
/**
* @brief close a channel handle
......
......@@ -7,6 +7,25 @@ import os.path
import pdb
from ctypes import *
class Dev(Structure):
_fields_ = [
( 'lun', c_int ),
( 'busnum', c_char * 6 ),
( 'devnum', c_char * 6 ),
( 'portnum', c_char * 6 ),
( 'busport', c_char * 16 ),
( 'devno', c_char * 10 ),
( 'serial', c_char * 48 ),
( 'path', c_char * 256 ),
( 'unused', c_int * 4 ),
]
class DevArray(Structure):
_fields_ = [
( 'ndevs', c_int ),
( 'devs', POINTER(Dev) ),
]
class OauTest(cmd.Cmd):
attn_values = {
......@@ -31,23 +50,44 @@ class OauTest(cmd.Cmd):
self.lun = None
self.fd = None
self.nchannels = None
self.fill_devarray()
def fill_devarray(self):
self.api.oau_get_devarray.restype = POINTER(DevArray)
self.devarray = self.api.oau_get_devarray(b'1556', b'0443')
ndevs = self.devarray.contents.ndevs
devs = self.devarray.contents.devs
self.devices = []
for i in range(ndevs):
dev = devs[i]
self.devices.append({
'lun' : dev.lun,
'busnum' : str(dev.busnum, 'utf8'),
'devnum' : str(dev.devnum, 'utf8'),
'portnum' : str(dev.portnum, 'utf8'),
'busport' : str(dev.busport, 'utf8'),
'devno' : str(dev.devno, 'utf8'),
'serial' : str(dev.serial, 'utf8'),
'path' : str(dev.path , 'utf8')})
def do_list(self, arg):
"""list devices and their access methods."""
pass
self.fill_devarray()
for i, dev in enumerate(self.devices):
print('{}: l:{} serial:{} busport:{}'.format(i,
dev['lun'], dev['serial'], dev['busport']))
def do_open(self, arg):
"""open device by serial number."""
serial = bytes(arg, 'utf8') if arg else 0
fd = self.api.oau_att_open(serial)
serial = self.devices[0]['serial'] if not arg else arg
fd = self.api.oau_att_open_by_serial(bytes(serial, 'utf8'))
if fd < 0:
print('cannot open device {}'.format(serial))
return
self.fd = fd
self.nchannels = self.read_nchannels()
print('current device: serial {}, fd {}, {} channels'.format(
str(serial, 'utf8') if serial else '??',
fd, self.nchannels))
serial, fd, self.nchannels))
def do_close(self, arg):
"""close connection to current device."""
......@@ -149,7 +189,7 @@ class OauTest(cmd.Cmd):
do_q = do_EOF
do_h = cmd.Cmd.do_help
do_ls = do_list
if __name__ == '__main__':
......
......@@ -4,30 +4,11 @@
#include <string.h>
#include <libudev.h>
#define OAU_VENDOR_ID "1556" /* CERN USB Vendor ID */
#define OAU_DEVICE_ID "0443" /* oau USB Device ID */
#define ID_VENDOR_ID OAU_VENDOR_ID
#define ID_DEVICE_ID OAU_DEVICE_ID
#include "usb-enum.h"
#define MAX_OUA 16
struct oau_usb_dev {
char path[PATH_MAX];
char busnum[6];
char devnum[6];
char portnum[6];
char busport[16];
char devno[10];
char serial[48];
};
struct oau_devlist {
struct oau_usb_dev *devs;
int ndevs;
};
void oau_display_devlist(struct oau_devlist *ls)
void oau_display_devarray(struct oau_devarray *ls)
{
int i;
for (i = 0; i < ls->ndevs; i++) {
......@@ -40,9 +21,9 @@ void oau_display_devlist(struct oau_devlist *ls)
}
static struct oau_usb_dev usb_dev[MAX_OUA];
static struct oau_devlist devlist = { usb_dev, -1, };
static struct oau_devarray devarray = { -1, usb_dev, };
static struct oau_devlist *oau_enumerate(char *vendor_id, char *device_id)
struct oau_devarray *oau_get_devarray(char *vendor_id, char *device_id)
{
struct udev *udev = udev_new();
struct udev_enumerate *enumerate = udev_enumerate_new(udev);
......@@ -67,22 +48,11 @@ static struct oau_devlist *oau_enumerate(char *vendor_id, char *device_id)
strcpy(entry->serial, udev_device_get_sysattr_value(dev, "serial"));
strcpy(entry->busport, rindex(entry->path, '/') + 1);
found_devs++;
found_devs += 1;
udev_device_unref(dev);
}
out:
udev_enumerate_unref(enumerate);
devlist.ndevs = found_devs;
return &devlist;
}
int main(int argc, char *argv[])
{
int i, devs;
struct oau_devlist *list;
list = oau_enumerate(ID_VENDOR_ID, ID_DEVICE_ID);
oau_display_devlist(list);
return 0;
devarray.ndevs = found_devs;
return &devarray;
}
/**
* @file usb-enum.h
*
* @brief OASIS USB Attenuator driver library interface
*
* This file describes the external interface to the OASIS USB Attenuator
* driver and provides the definitios for proper communication
* with the device
*
* Copyright (c) 2021 CERN
* @author David Cobas <dcobas AT cern.ch>
*
* @section license_sec License
* Released under the GPL v2. (and only v2, not any later version)
*/
struct oau_usb_dev {
int lun;
char busnum[6];
char devnum[6];
char portnum[6];
char busport[16];
char devno[10];
char serial[48];
char path[256];
int unused[4];
};
struct oau_devarray {
int ndevs;
struct oau_usb_dev *devs;
};
void oau_display_devarray(struct oau_devarray *ls);
struct oau_devarray *oau_get_devarray(char *vendor_id, char *device_id);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment