1
0
Fork 0
mirror of https://github.com/linux-usb-gadgets/libusbgx.git synced 2025-07-20 18:05:06 +03:00
libusbgx/src/function/serial.c
Krzysztof Opasiak 5637edd558 libusbgx: Switch to a new function API
Signed-off-by: Krzysztof Opasiak <k.opasiak@samsung.com>
2015-12-23 00:49:03 +01:00

97 lines
2.4 KiB
C

/*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
#include "usbg/usbg.h"
#include "usbg/usbg_internal.h"
#include "usbg/function/serial.h"
#ifdef HAS_LIBCONFIG
#include <libconfig.h>
#endif
struct usbg_f_serial {
struct usbg_function func;
};
GENERIC_ALLOC_INST(serial, struct usbg_f_serial, func);
GENERIC_FREE_INST(serial, struct usbg_f_serial, func);
static int serial_set_attrs(struct usbg_function *f, void *f_attrs)
{
int port_num = *(int *)f_attrs;
return port_num ? USBG_ERROR_INVALID_PARAM : USBG_SUCCESS;
}
static int serial_get_attrs(struct usbg_function *f, void *f_attrs)
{
return usbg_f_serial_get_port_num(usbg_to_serial_function(f), f_attrs);
}
static int serial_libconfig_import(struct usbg_function *f,
config_setting_t *root)
{
return USBG_SUCCESS;
}
static int serial_libconfig_export(struct usbg_function *f,
config_setting_t *root)
{
return USBG_SUCCESS;
}
/* We don' import nor export port_num as it is read only */
#define SERIAL_FUNCTION_OPTS \
.alloc_inst = serial_alloc_inst, \
.free_inst = serial_free_inst, \
.set_attrs = serial_set_attrs, \
.get_attrs = serial_get_attrs, \
.export = serial_libconfig_export, \
.import = serial_libconfig_import
struct usbg_function_type usbg_f_type_acm = {
.name = "acm",
SERIAL_FUNCTION_OPTS,
};
struct usbg_function_type usbg_f_type_serial = {
.name = "gser",
SERIAL_FUNCTION_OPTS,
};
struct usbg_function_type usbg_f_type_obex = {
.name = "obex",
SERIAL_FUNCTION_OPTS,
};
/* API implementation */
usbg_f_serial *usbg_to_serial_function(usbg_function *f)
{
return f->ops == &usbg_f_type_acm ||
f->ops == &usbg_f_type_serial ||
f->ops == &usbg_f_type_obex ?
container_of(f, struct usbg_f_serial, func) : NULL;
}
usbg_function *usbg_from_serial_function(usbg_f_serial *sf)
{
return &sf->func;
}
int usbg_f_serial_get_port_num(usbg_f_serial *sf, int *port_num)
{
return usbg_read_dec(sf->func.path, sf->func.name,
"port_num", port_num);
}