diff options
author | Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org> | 2020-02-21 05:24:36 +0100 |
---|---|---|
committer | Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org> | 2020-02-28 23:22:11 +0100 |
commit | 1fd0e6320fe7b39813238cf3d81258efc730e0d7 (patch) | |
tree | 19ad65a669ec473116c02221b8995333a5ee14e2 | |
parent | 9ff9785a7f48e32f107ca7fb2e298b1320ad4cbc (diff) | |
download | hardware_replicant_libsamsung-ipc-patches-todo/modem-abstraction-wip-rebase-2.tar.gz hardware_replicant_libsamsung-ipc-patches-todo/modem-abstraction-wip-rebase-2.tar.bz2 hardware_replicant_libsamsung-ipc-patches-todo/modem-abstraction-wip-rebase-2.zip |
Add a modem abstractionpatches-todo/modem-abstraction-wip-rebase-2
Some xmm626_kernel_smdk4412 functions are present for all devices:
- open|close|read|write|poll
- fmt/rfs
- gprs
- power
Thses are not
+----------+
| galaxys2 | | hci_power | link_control_enable | link_control_active | link_connected_wait | link_get_hostwake_wait | |
| i9300 | | hci_power | link_control_enable | link_control_active | link_connected_wait | link_get_hostwake_wait | |
| maguro | boot_power | | | | | | status_online_wait |
| n5100 | | hci_power | link_control_enable | link_control_active | link_connected_wait | link_get_hostwake_wait | |
| n7100 | | hci_power | link_control_enable | link_control_active | link_connected_wait | link_get_hostwake_wait | |
| piranha | | | | | | | |
+----------+
TODO: also don't add the python script to this commit or clean it up
Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
-rw-r--r-- | Android.mk | 2 | ||||
-rw-r--r-- | samsung-ipc/Makefile.am | 3 | ||||
-rw-r--r-- | samsung-ipc/devices/i9300/i9300.c | 35 | ||||
-rw-r--r-- | samsung-ipc/devices/ipc_devices.c | 4 | ||||
-rw-r--r-- | samsung-ipc/devices/ipc_devices.h | 1 | ||||
-rw-r--r-- | samsung-ipc/ipc.c | 1 | ||||
-rw-r--r-- | samsung-ipc/ipc.h | 36 | ||||
-rw-r--r-- | samsung-ipc/modems/modem.c | 126 | ||||
-rw-r--r-- | samsung-ipc/modems/modem.h | 35 | ||||
-rw-r--r-- | samsung-ipc/modems/xmm626/xmm626_kernel_smdk4412.c | 27 | ||||
-rwxr-xr-x | smdk4412_func_usage.py | 83 |
11 files changed, 336 insertions, 17 deletions
@@ -52,6 +52,7 @@ endif libsamsung_ipc_local_src_files := \ samsung-ipc/ipc.c \ samsung-ipc/ipc_utils.c \ + samsung-ipc/modems/modem.c \ samsung-ipc/modems/xmm616/xmm616.c \ samsung-ipc/modems/xmm626/xmm626.c \ samsung-ipc/modems/xmm626/xmm626_hsic.c \ @@ -104,6 +105,7 @@ libsamsung_ipc_local_c_includes := \ $(LOCAL_PATH)/include \ $(LOCAL_PATH)/samsung-ipc \ $(LOCAL_PATH)/samsung-ipc/devices/ \ + $(LOCAL_PATH)/samsung-ipc/modems/ $(LOCAL_PATH)/samsung-ipc/modems/xmm616/ \ $(LOCAL_PATH)/samsung-ipc/modems/xmm626/ \ external/openssl/include diff --git a/samsung-ipc/Makefile.am b/samsung-ipc/Makefile.am index 1b18760..b077ba6 100644 --- a/samsung-ipc/Makefile.am +++ b/samsung-ipc/Makefile.am @@ -4,6 +4,7 @@ AM_CFLAGS = \ -I$(top_srcdir)/include \ -I$(top_srcdir)/samsung-ipc \ -I$(top_srcdir)/samsung-ipc/devices \ + -I$(top_srcdir)/samsung-ipc/modems \ -I$(top_srcdir)/samsung-ipc/modems/xmm616 \ -I$(top_srcdir)/samsung-ipc/modems/xmm626 \ $(OPENSSL_CFLAGS) \ @@ -21,6 +22,8 @@ libsamsung_ipc_la_SOURCES = \ ipc.c \ ipc.h \ ipc_utils.c \ + modems/modem.c \ + modems/modem.h \ modems/xmm616/xmm616.c \ modems/xmm616/xmm616.h \ modems/xmm626/xmm626.c \ diff --git a/samsung-ipc/devices/i9300/i9300.c b/samsung-ipc/devices/i9300/i9300.c index cb14f38..42f6828 100644 --- a/samsung-ipc/devices/i9300/i9300.c +++ b/samsung-ipc/devices/i9300/i9300.c @@ -27,6 +27,7 @@ #include <samsung-ipc.h> #include "i9300.h" +#include "modem.h" #include "xmm626.h" #include "xmm626_hsic.h" #include "xmm626_kernel_smdk4412.h" @@ -75,7 +76,7 @@ int i9300_boot(struct ipc_client *client) } ipc_client_log(client, "Opened modem link device"); - rc = xmm626_kernel_smdk4412_hci_power(client, 0); + rc = modem_bus_power(client, 0); if (rc < 0) { ipc_client_log(client, "Turning the modem off failed"); goto error; @@ -83,7 +84,7 @@ int i9300_boot(struct ipc_client *client) ipc_client_log(client, "Turned the modem off"); rc = xmm626_kernel_smdk4412_power(client, modem_boot_fd, 1); - rc |= xmm626_kernel_smdk4412_hci_power(client, 1); + rc |= modem_bus_power(client, 1); if (rc < 0) { ipc_client_log(client, "Turning the modem on failed"); @@ -91,7 +92,7 @@ int i9300_boot(struct ipc_client *client) } ipc_client_log(client, "Turned the modem on"); - rc = xmm626_kernel_smdk4412_link_connected_wait(client, modem_link_fd); + rc = modem_link_connected_wait(client, modem_link_fd); if (rc < 0) { ipc_client_log(client, "Waiting for link connected failed"); goto error; @@ -168,37 +169,37 @@ int i9300_boot(struct ipc_client *client) usleep(300000); - rc = xmm626_kernel_smdk4412_link_get_hostwake_wait(client, modem_link_fd); + rc = modem_link_get_hostwake_wait(client, modem_link_fd); if (rc < 0) { ipc_client_log(client, "Waiting for host wake failed"); } - rc = xmm626_kernel_smdk4412_link_control_enable(client, modem_link_fd, 0); - rc |= xmm626_kernel_smdk4412_hci_power(client, 0); - rc |= xmm626_kernel_smdk4412_link_control_active(client, modem_link_fd, 0); + rc = modem_link_control_enable(client, modem_link_fd, 0); + rc |= modem_bus_power(client, 0); + rc |= modem_link_control_active(client, modem_link_fd, 0); if (rc < 0) { ipc_client_log(client, "Turning the modem off failed"); goto error; } - rc = xmm626_kernel_smdk4412_link_get_hostwake_wait(client, modem_link_fd); + rc = modem_link_get_hostwake_wait(client, modem_link_fd); if (rc < 0) { ipc_client_log(client, "Waiting for host wake failed"); goto error; } ipc_client_log(client, "Waited for host wake"); - rc = xmm626_kernel_smdk4412_link_control_enable(client, modem_link_fd, 1); - rc |= xmm626_kernel_smdk4412_hci_power(client, 1); - rc |= xmm626_kernel_smdk4412_link_control_active(client, modem_link_fd, 1); + rc = modem_link_control_enable(client, modem_link_fd, 1); + rc |= modem_bus_power(client, 1); + rc |= modem_link_control_active(client, modem_link_fd, 1); if (rc < 0) { ipc_client_log(client, "Turning the modem on failed"); goto error; } - rc = xmm626_kernel_smdk4412_link_connected_wait(client, modem_link_fd); + rc = modem_link_connected_wait(client, modem_link_fd); if (rc < 0) { ipc_client_log(client, "Waiting for link connected failed"); goto error; @@ -239,7 +240,7 @@ int i9300_open(__attribute__((unused)) struct ipc_client *client, void *data, transport_data = (struct i9300_transport_data *) data; - transport_data->fd = xmm626_kernel_smdk4412_open(client, type); + transport_data->fd = modem_open(client, type); if (transport_data->fd < 0) return -1; @@ -255,7 +256,7 @@ int i9300_close(__attribute__((unused)) struct ipc_client *client, void *data) transport_data = (struct i9300_transport_data *) data; - xmm626_kernel_smdk4412_close(client, transport_data->fd); + modem_close(client, transport_data->fd); transport_data->fd = -1; return 0; @@ -272,7 +273,7 @@ int i9300_read(__attribute__((unused)) struct ipc_client *client, void *data, transport_data = (struct i9300_transport_data *) data; - rc = xmm626_kernel_smdk4412_read(client, transport_data->fd, buffer, length); + rc = modem_read(client, transport_data->fd, buffer, length); return rc; } @@ -288,7 +289,7 @@ int i9300_write(__attribute__((unused)) struct ipc_client *client, void *data, transport_data = (struct i9300_transport_data *) data; - rc = xmm626_kernel_smdk4412_write(client, transport_data->fd, buffer, length); + rc = modem_write(client, transport_data->fd, buffer, length); return rc; } @@ -304,7 +305,7 @@ int i9300_poll(__attribute__((unused)) struct ipc_client *client, void *data, transport_data = (struct i9300_transport_data *) data; - rc = xmm626_kernel_smdk4412_poll(client, transport_data->fd, fds, timeout); + rc = modem_poll(client, transport_data->fd, fds, timeout); return rc; } diff --git a/samsung-ipc/devices/ipc_devices.c b/samsung-ipc/devices/ipc_devices.c index ad7d23c..a226d20 100644 --- a/samsung-ipc/devices/ipc_devices.c +++ b/samsung-ipc/devices/ipc_devices.c @@ -22,6 +22,9 @@ #include <samsung-ipc.h> #include <ipc_devices.h> +// TODO +extern struct ipc_client_modem_driver_ops smdk4412_xmm626_modem_driver_ops; + struct ipc_device_desc ipc_devices[] = { { .name = "crespo", @@ -132,6 +135,7 @@ struct ipc_device_desc ipc_devices[] = { .handlers = &i9300_handlers, .gprs_specs = &i9300_gprs_specs, .nv_data_specs = &i9300_nv_data_specs, + .modem_driver_ops = &smdk4412_xmm626_modem_driver_ops, }, { .name = "n7100", diff --git a/samsung-ipc/devices/ipc_devices.h b/samsung-ipc/devices/ipc_devices.h index a7a6098..b7d81e4 100644 --- a/samsung-ipc/devices/ipc_devices.h +++ b/samsung-ipc/devices/ipc_devices.h @@ -42,6 +42,7 @@ struct ipc_device_desc { struct ipc_client_handlers *handlers; struct ipc_client_gprs_specs *gprs_specs; struct ipc_client_nv_data_specs *nv_data_specs; + struct ipc_client_modem_driver_ops *modem_driver_ops; }; extern struct ipc_device_desc ipc_devices[]; diff --git a/samsung-ipc/ipc.c b/samsung-ipc/ipc.c index 6f297c4..6adc02e 100644 --- a/samsung-ipc/ipc.c +++ b/samsung-ipc/ipc.c @@ -206,6 +206,7 @@ static struct ipc_client *ipc_transport_client_create(int type) client->gprs_specs = ipc_devices[device_index].gprs_specs; client->nv_data_specs = ipc_devices[device_index].nv_data_specs; + client->modem_driver_ops = ipc_devices[device_index].modem_driver_ops; /* Handlers can be modified */ client->handlers = (struct ipc_client_handlers *) calloc(1, diff --git a/samsung-ipc/ipc.h b/samsung-ipc/ipc.h index 7b30092..7f4f04b 100644 --- a/samsung-ipc/ipc.h +++ b/samsung-ipc/ipc.h @@ -77,6 +77,41 @@ struct ipc_client_gprs_specs { struct ipc_client_gprs_capabilities *capabilities); }; +struct ipc_client_modem_driver_ops { + int (*power)(struct ipc_client *client, int device_fd, int power); + // TODO + // int (*boot_power)(struct ipc_client *client, int device_fd, int power); + int (*bus_power)(struct ipc_client *client, int power); + int (*link_control_enable)(struct ipc_client *client, int device_fd, + int enable); + int (*link_control_active)(struct ipc_client *client, int device_fd, + int active); + int (*link_connected_wait)(struct ipc_client *client, int device_fd); + int (*link_get_hostwake_wait)(struct ipc_client *client, int device_fd); + // int (*xmm626_kernel_smdk4412_status_online_wait)( + // __attribute__((unused)) struct ipc_client *client, + // TODO + // int device_fd); + + int (*open)(struct ipc_client *client, int type); + int (*close)(struct ipc_client *client, int fd); + int (*read)(struct ipc_client *client, int fd, void *buffer, size_t length); + int (*write)(struct ipc_client *client, int fd, const void *buffer, + size_t length); + int (*poll)(struct ipc_client *client, int fd, struct ipc_poll_fds *fds, + struct timeval *timeout); + + int (*fmt_send)(struct ipc_client *client, struct ipc_message *message); + int (*fmt_recv)(struct ipc_client *client, struct ipc_message *message); + int (*rfs_send)(struct ipc_client *client, struct ipc_message *message); + int (*rfs_recv)(struct ipc_client *client, struct ipc_message *message); + + char * (*gprs_get_iface)(struct ipc_client *client, unsigned int cid); + int (*gprs_get_capabilities)(struct ipc_client *client, + struct ipc_client_gprs_capabilities *capabilities); +}; + + struct ipc_client_nv_data_specs { char *nv_data_path; char *nv_data_md5_path; @@ -97,6 +132,7 @@ struct ipc_client { struct ipc_client_handlers *handlers; struct ipc_client_gprs_specs *gprs_specs; struct ipc_client_nv_data_specs *nv_data_specs; + struct ipc_client_modem_driver_ops *modem_driver_ops; }; /* diff --git a/samsung-ipc/modems/modem.c b/samsung-ipc/modems/modem.c new file mode 100644 index 0000000..2c6bf3f --- /dev/null +++ b/samsung-ipc/modems/modem.c @@ -0,0 +1,126 @@ +/* + * This file is part of libsamsung-ipc. + * + * Copyright (C) 2020 Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org> + * + * libsamsung-ipc is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * libsamsung-ipc 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libsamsung-ipc. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <ipc.h> + +// TODO +// int modem_boot_power(struct ipc_client *client, int device_fd, int power) +// { +// return client->modem_driver_ops->boot_power(client, device_fd, power); +// } +// + +int modem_power(struct ipc_client *client, int device_fd, int power) +{ + return client->modem_driver_ops->power(client, device_fd, power); +} + +int modem_bus_power(struct ipc_client *client, int power) +{ + return client->modem_driver_ops->bus_power(client, power); +} + +int modem_link_control_enable(struct ipc_client *client, int device_fd, + int enable) +{ + return client->modem_driver_ops->link_control_enable(client, device_fd, + enable); +} + +int modem_link_control_active(struct ipc_client *client, int device_fd, + int active) +{ + return client->modem_driver_ops->link_control_active(client, device_fd, + active); +} + +int modem_link_connected_wait(struct ipc_client *client, int device_fd) +{ + return client->modem_driver_ops->link_connected_wait(client, device_fd); +} + +int modem_link_get_hostwake_wait(struct ipc_client *client, int device_fd) +{ + return client->modem_driver_ops->link_get_hostwake_wait(client, device_fd); +} + +// TODO +// int modem_status_online_wait(__attribute__((unused)) struct ipc_client *client, +// int device_fd) +// { +// return client->modem_driver_ops->modem_status_online_wait(client, device_fd); +// } +// +int modem_open(struct ipc_client *client, int type) +{ + return client->modem_driver_ops->open(client, type); +} + +int modem_close(struct ipc_client *client, int fd) +{ + return client->modem_driver_ops->close(client, fd); +} + +int modem_read(struct ipc_client *client, int fd, void *buffer, size_t length) +{ + return client->modem_driver_ops->read(client, fd, buffer, length); +} + +int modem_write(struct ipc_client *client, int fd, const void *buffer, + size_t length) +{ + return client->modem_driver_ops->write(client, fd, buffer, length); +} + +int modem_poll(struct ipc_client *client, int fd, struct ipc_poll_fds *fds, + struct timeval *timeout) +{ + return client->modem_driver_ops->poll(client, fd, fds, timeout); +} + +int modem_fmt_send(struct ipc_client *client, struct ipc_message *message) +{ + return client->modem_driver_ops->fmt_send(client, message); +} + +int modem_fmt_recv(struct ipc_client *client, struct ipc_message *message) +{ + return client->modem_driver_ops->fmt_recv(client, message); +} + +int modem_rfs_send(struct ipc_client *client, struct ipc_message *message) +{ + return client->modem_driver_ops->rfs_send(client, message); +} + +int modem_rfs_recv(struct ipc_client *client, struct ipc_message *message) +{ + return client->modem_driver_ops->rfs_recv(client, message); +} + +char *modem_gprs_get_iface(struct ipc_client *client, unsigned int cid) +{ + return client->modem_driver_ops->gprs_get_iface(client, cid); +} + +int modem_gprs_get_capabilities(struct ipc_client *client, + struct ipc_client_gprs_capabilities *capabilities) +{ + return client->modem_driver_ops->gprs_get_capabilities(client, capabilities); +} diff --git a/samsung-ipc/modems/modem.h b/samsung-ipc/modems/modem.h new file mode 100644 index 0000000..f62b774 --- /dev/null +++ b/samsung-ipc/modems/modem.h @@ -0,0 +1,35 @@ +#ifndef __SAMSUNG_IPC_MODEM_H__ +#define __SAMSUNG_IPC_MODEM_H__ +// Only on maguro: +// int modem_boot_power(__attribute__((unused)) struct ipc_client *client, +// int device_fd, int power) +int modem_power(struct ipc_client *client, int device_fd, int power); +int modem_bus_power(struct ipc_client *client, int power); +int modem_link_control_enable(struct ipc_client *client, int device_fd, + int enable); +int modem_link_control_active(struct ipc_client *client, int device_fd, + int active); +int modem_link_connected_wait(struct ipc_client *client, int device_fd); +int modem_link_get_hostwake_wait(struct ipc_client *client, int device_fd); +// TODO: only on maguro +// int xmm626_kernel_smdk4412_status_online_wait( +// __attribute__((unused)) struct ipc_client *client, int device_fd); + +int modem_open(struct ipc_client *client, int type); +int modem_close(struct ipc_client *client, int fd); +int modem_read(struct ipc_client *client, int fd, void *buffer, size_t length); +int modem_write(struct ipc_client *client, int fd, const void *buffer, + size_t length); +int modem_poll(struct ipc_client *client, int fd, struct ipc_poll_fds *fds, + struct timeval *timeout); + +int modem_fmt_send(struct ipc_client *client, struct ipc_message *message); +int modem_fmt_recv(struct ipc_client *client, struct ipc_message *message); +int modem_rfs_send(struct ipc_client *client, struct ipc_message *message); +int modem_rfs_recv(struct ipc_client *client, struct ipc_message *message); + +char *modem_gprs_get_iface(struct ipc_client *client, unsigned int cid); +int modem_gprs_get_capabilities(struct ipc_client *client, + struct ipc_client_gprs_capabilities *capabilities); + +#endif /* __SAMSUNG_IPC_MODEM_H__ */ diff --git a/samsung-ipc/modems/xmm626/xmm626_kernel_smdk4412.c b/samsung-ipc/modems/xmm626/xmm626_kernel_smdk4412.c index 283aa4b..41c6a98 100644 --- a/samsung-ipc/modems/xmm626/xmm626_kernel_smdk4412.c +++ b/samsung-ipc/modems/xmm626/xmm626_kernel_smdk4412.c @@ -583,4 +583,31 @@ int xmm626_kernel_smdk4412_gprs_get_capabilities(__attribute__((unused)) struct return 0; } +struct ipc_client_modem_driver_ops smdk4412_xmm626_modem_driver_ops = { + // TODO + // ._boot_power = xmm626_kernel_smdk4412_boot_power, + .power = xmm626_kernel_smdk4412_power, + .bus_power = xmm626_kernel_smdk4412_hci_power, + .link_control_enable = xmm626_kernel_smdk4412_link_control_enable, + .link_control_active = xmm626_kernel_smdk4412_link_control_active, + .link_connected_wait = xmm626_kernel_smdk4412_link_connected_wait, + .link_get_hostwake_wait = xmm626_kernel_smdk4412_link_get_hostwake_wait, + // .status_online_wait = xmm626_kernel_smdk4412_status_online_wait, + + .open = xmm626_kernel_smdk4412_open, + .close = xmm626_kernel_smdk4412_close, + .read = xmm626_kernel_smdk4412_read, + .write = xmm626_kernel_smdk4412_write, + .poll = xmm626_kernel_smdk4412_poll, + + .fmt_send = xmm626_kernel_smdk4412_fmt_send, + .fmt_recv = xmm626_kernel_smdk4412_fmt_recv, + .rfs_send = xmm626_kernel_smdk4412_rfs_send, + .rfs_recv = xmm626_kernel_smdk4412_rfs_recv, + + // TODO + // .gprs_get_iface = xmm626_kernel_smdk4412_gprs_get_iface, + // .modem_gprs_get_capabilities = xmm626_kernel_smdk4412_modem_gprs_get_capabilities, +}; + // vim:ts=4:sw=4:expandtab diff --git a/smdk4412_func_usage.py b/smdk4412_func_usage.py new file mode 100755 index 0000000..d09d50d --- /dev/null +++ b/smdk4412_func_usage.py @@ -0,0 +1,83 @@ +#!/bin/env python + +import os +import re +from sh import git + +funcs = [ + 'xmm626_kernel_smdk4412_power', + 'xmm626_kernel_smdk4412_boot_power', + 'xmm626_kernel_smdk4412_hci_power', + 'xmm626_kernel_smdk4412_link_control_enable', + 'xmm626_kernel_smdk4412_link_control_active', + 'xmm626_kernel_smdk4412_link_connected_wait', + 'xmm626_kernel_smdk4412_link_get_hostwake_wait', + 'xmm626_kernel_smdk4412_status_online_wait', + 'xmm626_kernel_smdk4412_open', + 'xmm626_kernel_smdk4412_close', + 'xmm626_kernel_smdk4412_read', + 'xmm626_kernel_smdk4412_write', + 'xmm626_kernel_smdk4412_poll', + 'xmm626_kernel_smdk4412_fmt_send', + 'xmm626_kernel_smdk4412_fmt_recv', + 'xmm626_kernel_smdk4412_rfs_send', + 'xmm626_kernel_smdk4412_rfs_recv', + 'xmm626_kernel_smdk4412_gprs_get_iface', + 'xmm626_kernel_smdk4412_gprs_get_capabilities', +] + +results = {} + +def func_usage(func): + output = "" + try: + output = git('--no-pager', 'grep', '--color=never', func) + except: + pass + + for line in output: + filepath = line.split(":")[0] + content = line.split(":")[1] + + device = None + if re.match('samsung-ipc/devices/.*/*\.c$', filepath): + device = re.sub('\.c', '', os.path.basename(filepath)) + if device not in results: + results[device] = {} + results[device][func] = True + +def print_func_group(device, device_data, device_maxlen, funcs, regex): + print ("| {}{} |".format(device, " " * (device_maxlen - len(device))), end='') + for func in funcs: + if re.search(regex, func): + func_name = re.sub('xmm626_kernel_smdk4412_','', func) + if func in device_data: + print (" {} |".format(func_name), end='') + else: + print (" {} |".format(" " * len(func_name)), end='') + print() + +def report_results(results): + device_maxlen = 0 + for key in results.keys(): + if len(key) > device_maxlen: + device_maxlen = len(key) + + + print ("+{}+".format("-" * (device_maxlen + 2))) + for device, device_data in results.items(): + # All: + # print_func_group(device, device_data, device_maxlen, funcs, "open|close|read|write|poll") + # print_func_group(device, device_data, device_maxlen, funcs, "fmt|rfs") + # print_func_group(device, device_data, device_maxlen, funcs, "gprs") + + + print_func_group(device, device_data, device_maxlen, funcs, "power|link|status") + + print ("+{}+".format("-" * (device_maxlen + 2))) + + +for func in funcs: + func_usage(func) + +report_results(results) |