diff options
author | Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org> | 2020-02-21 05:24:36 +0100 |
---|---|---|
committer | Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org> | 2020-07-16 06:15:54 +0200 |
commit | 0fbf8eb1dd1c68569d19c4e6333ba049c8a420a8 (patch) | |
tree | e4a2aebf78e4ce9243eda5cf7c499902c7c11755 | |
parent | 97321a09aa9b0de128d306e994f7129a57f5bf91 (diff) | |
download | hardware_replicant_libsamsung-ipc-patches-todo/modem-abstraction-wip-rebase-3.tar.gz hardware_replicant_libsamsung-ipc-patches-todo/modem-abstraction-wip-rebase-3.tar.bz2 hardware_replicant_libsamsung-ipc-patches-todo/modem-abstraction-wip-rebase-3.zip |
Add a modem abstractionpatches-todo/modem-abstraction-wip-rebase-3
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:
- don't add the python script to this commit or clean it up
- cleanup style
- Verify if we need to convert all boards in this commit
- Look if i9300 changes should go in this commit
Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
20 files changed, 452 insertions, 23 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 \ diff --git a/samsung-ipc/Makefile.am b/samsung-ipc/Makefile.am index f71e396..2b89bc0 100644 --- a/samsung-ipc/Makefile.am +++ b/samsung-ipc/Makefile.am @@ -18,16 +18,18 @@ 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 \ modems/xmm626/xmm626.h \ - modems/xmm626/xmm626_hsic.c \ - modems/xmm626/xmm626_hsic.h \ - modems/xmm626/xmm626_kernel_smdk4412.c \ + modems/xmm626/hsic/hsic.c \ + modems/xmm626/hsic/xmm626_hsic.h \ + modems/xmm626/kernel_smdk4412.c \ modems/xmm626/xmm626_kernel_smdk4412.h \ - modems/xmm626/xmm626_mipi.c \ - modems/xmm626/xmm626_mipi.h \ + modems/xmm626/mipi/mipi.c \ + modems/xmm626/mipi/xmm626_mipi.h \ modems/xmm626/xmm626_modem.h \ modems/xmm626/xmm626_modem_link_device_hsic.h \ modems/xmm626/xmm626_modem_prj.h \ diff --git a/samsung-ipc/devices/galaxys2/galaxys2.c b/samsung-ipc/devices/galaxys2/galaxys2.c index cdfe20c..296feac 100644 --- a/samsung-ipc/devices/galaxys2/galaxys2.c +++ b/samsung-ipc/devices/galaxys2/galaxys2.c @@ -28,7 +28,7 @@ #include "ipc.h" #include "devices/galaxys2/galaxys2.h" #include "modems/xmm626/xmm626.h" -#include "modems/xmm626/xmm626_hsic.h" +#include "modems/xmm626/hsic/hsic.h" #include "modems/xmm626/xmm626_kernel_smdk4412.h" int galaxys2_boot(struct ipc_client *client) diff --git a/samsung-ipc/devices/i9300/i9300.c b/samsung-ipc/devices/i9300/i9300.c index 85709a8..355ff62 100644 --- a/samsung-ipc/devices/i9300/i9300.c +++ b/samsung-ipc/devices/i9300/i9300.c @@ -28,7 +28,7 @@ #include "ipc.h" #include "devices/i9300/i9300.h" #include "modems/xmm626/xmm626.h" -#include "modems/xmm626/xmm626_hsic.h" +#include "modems/xmm626/hsic/hsic.h" #include "modems/xmm626/xmm626_kernel_smdk4412.h" int i9300_boot(struct ipc_client *client) diff --git a/samsung-ipc/devices/ipc_devices.h b/samsung-ipc/devices/ipc_devices.h index 176607c..17a40b8 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/devices/maguro/maguro.c b/samsung-ipc/devices/maguro/maguro.c index a2db5fc..e6cd191 100644 --- a/samsung-ipc/devices/maguro/maguro.c +++ b/samsung-ipc/devices/maguro/maguro.c @@ -30,7 +30,7 @@ #include "devices/maguro/maguro.h" #include "modems/xmm626/xmm626.h" #include "modems/xmm626/xmm626_kernel_smdk4412.h" -#include "modems/xmm626/xmm626_mipi.h" +#include "modems/xmm626/mipi/xmm626_mipi.h" int maguro_boot(struct ipc_client *client) { diff --git a/samsung-ipc/devices/n5100/n5100.c b/samsung-ipc/devices/n5100/n5100.c index 0abe896..5489fb6 100644 --- a/samsung-ipc/devices/n5100/n5100.c +++ b/samsung-ipc/devices/n5100/n5100.c @@ -29,7 +29,7 @@ #include "ipc.h" #include "devices/n5100/n5100.h" #include "modems/xmm626/xmm626.h" -#include "modems/xmm626/xmm626_hsic.h" +#include "modems/xmm626/hsic/hsic.h" #include "modems/xmm626/xmm626_kernel_smdk4412.h" int n5100_boot(struct ipc_client *client) diff --git a/samsung-ipc/devices/n7100/n7100.c b/samsung-ipc/devices/n7100/n7100.c index d5091a2..4713e00 100644 --- a/samsung-ipc/devices/n7100/n7100.c +++ b/samsung-ipc/devices/n7100/n7100.c @@ -28,7 +28,7 @@ #include "ipc.h" #include "devices/n7100/n7100.h" #include "modems/xmm626/xmm626.h" -#include "modems/xmm626/xmm626_hsic.h" +#include "modems/xmm626/hsic/hsic.h" #include "modems/xmm626/xmm626_kernel_smdk4412.h" int n7100_boot(struct ipc_client *client) diff --git a/samsung-ipc/devices/piranha/piranha.c b/samsung-ipc/devices/piranha/piranha.c index 839b3ce..a98e1cb 100644 --- a/samsung-ipc/devices/piranha/piranha.c +++ b/samsung-ipc/devices/piranha/piranha.c @@ -29,7 +29,7 @@ #include "devices/piranha/piranha.h" #include "modems/xmm626/xmm626.h" #include "modems/xmm626/xmm626_kernel_smdk4412.h" -#include "modems/xmm626/xmm626_mipi.h" +#include "modems/xmm626/mipi/xmm626_mipi.h" int piranha_boot(struct ipc_client *client) { diff --git a/samsung-ipc/ipc.c b/samsung-ipc/ipc.c index c116fbb..efdd5d2 100644 --- a/samsung-ipc/ipc.c +++ b/samsung-ipc/ipc.c @@ -214,6 +214,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( diff --git a/samsung-ipc/ipc.h b/samsung-ipc/ipc.h index 1cfa757..dfeea11 100644 --- a/samsung-ipc/ipc.h +++ b/samsung-ipc/ipc.h @@ -78,6 +78,49 @@ 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); + int (*download_enable)(struct ipc_client *client, int device_fd, + int enable); + 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 (*wait_status_online)( + __attribute__((unused)) struct ipc_client *client, + 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); + //TODO: find a better name not to conflict with fmt/rfs send + // like block-data send (used for firmware) + // what about firmware->MAIN + // and data_send firmware_send + // or send_partition + // or send_block + int (*data_send)(struct ipc_client *client, int device_fd, const void *data, + size_t size, int address); + + 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; @@ -98,6 +141,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..82a6ca7 --- /dev/null +++ b/samsung-ipc/modems/modem.c @@ -0,0 +1,194 @@ +/* + * 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> + +/* Set the modem into download mode */ +int modem_download_enable(struct ipc_client *client, int device_fd, int enable) +{ + return client->modem_driver_ops->download_enable(client, device_fd, + enable); +} + +/* Power on/off the modem */ +int modem_power(struct ipc_client *client, int device_fd, int power) +{ + return client->modem_driver_ops->power(client, device_fd, power); +} + +/* Power on/off the modem bus (HSIC, MIPI, etc) */ +int modem_bus_power(struct ipc_client *client, int power) +{ + return client->modem_driver_ops->bus_power(client, power); +} + +// TODO +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); +} + +//TODO +//0: HSIC is low power +//1: HSIC is back +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); +} + +//TODO: +int modem_link_connected_wait(struct ipc_client *client, int device_fd) +{ + return client->modem_driver_ops->link_connected_wait(client, device_fd); +} + +// TODO +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); +} + +/* Wait for the modem driver to report the ONLINE status */ +int modem_wait_status_online(__attribute__((unused)) struct ipc_client *client, + int device_fd) +{ + return client->modem_driver_ops->wait_status_online(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); +} + +// TODO +char *modem_gprs_get_iface(struct ipc_client *client, unsigned int cid) +{ + return client->modem_driver_ops->gprs_get_iface(client, cid); +} + +// TODO +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); +} + +// TODO: make it more generic: +// - get rid of device_fd +// - we have many <modem>_<firmware_partition>_send +// functions for partitions: +// | Function | Partition | +// | psi | PSIRAM | +// | ebl | EBL | +// | firmware | MAIN | +// | sec_start | SECPACK | +// | device specific | NV | + +// int modem_psi_send(struct ipc_client *client, int serial_fd, +// const void *psi_data, unsigned short psi_size); +// { +// /* TODO: get rid of serial_fd */ +// return client->modem_driver_ops->psi_send(client, serial_fd, psi_data, +// psi_size); +// } +// +// int modem_firmware_send(struct ipc_client *client, int device_fd, +// void *device_address, const void *firmware_data, +// size_t firmware_size) +// { +// /* TODO: get rid of device_fd */ +// return client->modem_driver_ops->firmware_send(client, device_fd, +// device_address, +// firmware_data, +// firmware_size); +// } +// +// int modem_nv_data_send(struct ipc_client *client, int device_fd, +// void *device_address) +// { +// /* TODO: get rid of device_fd */ +// return client->modem_driver_ops->firmware_send(client, device_fd, +// device_address); +// } +// +// +// int modem_psi_send(struct ipc_client *client, int serial_fd, +// const void *psi_data, unsigned short psi_size); +// { +// /* TODO: get rid of serial_fd */ +// return client->modem_driver_ops->psi_send(client, serial_fd, psi_data, +// psi_size); +// } +// + +// TODO: find a better name like block data (used for fimrware partitions) +int modem_data_send(struct ipc_client *client, int device_fd, const void *data, + size_t size, int address) +{ + return client->modem_driver_ops->data_send(client, device_fd, data, + size, address); +} diff --git a/samsung-ipc/modems/modem.h b/samsung-ipc/modems/modem.h new file mode 100644 index 0000000..9935df6 --- /dev/null +++ b/samsung-ipc/modems/modem.h @@ -0,0 +1,35 @@ +#ifndef __SAMSUNG_IPC_MODEM_H__ +#define __SAMSUNG_IPC_MODEM_H__ +int modem_download_enable(__attribute__((unused)) struct ipc_client *client, + int device_fd, int enable); +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); +int modem_wait_status(_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); +// TODO: find a better name like block data (used for fimrware partitions) +int modem_data_send(struct ipc_client *client, int device_fd, const void *data, + size_t size, int address); + +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_hsic.c b/samsung-ipc/modems/xmm626/hsic/hsic.c index 6e7126c..e1e2883 100644 --- a/samsung-ipc/modems/xmm626/xmm626_hsic.c +++ b/samsung-ipc/modems/xmm626/hsic/hsic.c @@ -29,8 +29,10 @@ #include <samsung-ipc.h> +#include "ipc.h" +#include "modems/xmm626/xmm626_kernel_smdk4412.h" #include "modems/xmm626/xmm626.h" -#include "modems/xmm626/xmm626_hsic.h" +#include "modems/xmm626/hsic/hsic.h" int xmm626_hsic_ack_read(int device_fd, unsigned short ack) { @@ -391,8 +393,8 @@ complete: return rc; } -int xmm626_hsic_modem_data_send(int device_fd, const void *data, size_t size, - int address) +int xmm626_hsic_modem_data_send(struct ipc_client *client, int device_fd, + const void *data, size_t size, int address) { size_t chunk; size_t count; @@ -543,7 +545,7 @@ int xmm626_hsic_firmware_send(struct ipc_client *client, int device_fd, return -1; } - rc = xmm626_hsic_modem_data_send(device_fd, firmware_data, + rc = xmm626_hsic_modem_data_send(client, device_fd, firmware_data, firmware_size, XMM626_FIRMWARE_ADDRESS); if (rc < 0) @@ -572,7 +574,7 @@ int xmm626_hsic_nv_data_send(struct ipc_client *client, int device_fd) } ipc_client_log(client, "Loaded nv_data"); - rc = xmm626_hsic_modem_data_send(device_fd, nv_data, nv_size, + rc = xmm626_hsic_modem_data_send(client, device_fd, nv_data, nv_size, XMM626_NV_DATA_ADDRESS); if (rc < 0) goto error; @@ -610,3 +612,33 @@ int xmm626_hsic_hw_reset_send(struct ipc_client *client, int device_fd) return 0; } + +struct ipc_client_modem_driver_ops smdk4412_xmm626_hsic_modem_driver_ops = { + .download_enable = 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, + .wait_status_online = 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: find a better name for data_send + .data_send = xmm626_hsic_modem_data_send, + + // TODO + // .gprs_get_iface = xmm626_kernel_smdk4412_gprs_get_iface, + // .modem_gprs_get_capabilities = xmm626_kernel_smdk4412_modem_gprs_get_capabilities, +}; + diff --git a/samsung-ipc/modems/xmm626/xmm626_hsic.h b/samsung-ipc/modems/xmm626/hsic/hsic.h index 6385cdc..fc172d5 100644 --- a/samsung-ipc/modems/xmm626/xmm626_hsic.h +++ b/samsung-ipc/modems/xmm626/hsic/hsic.h @@ -63,5 +63,8 @@ int xmm626_hsic_firmware_send(struct ipc_client *client, int device_fd, const void *firmware_data, size_t firmware_size); int xmm626_hsic_nv_data_send(struct ipc_client *client, int device_fd); int xmm626_hsic_hw_reset_send(struct ipc_client *client, int device_fd); +int xmm626_hsic_modem_data_send(struct ipc_client *client, int device_fd, + const void *data, size_t size, int address); + #endif /* __XMM626_HSIC_H__ */ diff --git a/samsung-ipc/modems/xmm626/xmm626_modem_link_device_hsic.h b/samsung-ipc/modems/xmm626/hsic/xmm626_modem_link_device_hsic.h index f2421e0..f2421e0 100644 --- a/samsung-ipc/modems/xmm626/xmm626_modem_link_device_hsic.h +++ b/samsung-ipc/modems/xmm626/hsic/xmm626_modem_link_device_hsic.h diff --git a/samsung-ipc/modems/xmm626/xmm626_kernel_smdk4412.c b/samsung-ipc/modems/xmm626/kernel_smdk4412.c index c6b1578..d9c7620 100644 --- a/samsung-ipc/modems/xmm626/xmm626_kernel_smdk4412.c +++ b/samsung-ipc/modems/xmm626/kernel_smdk4412.c @@ -32,7 +32,7 @@ #include "ipc.h" #include "modems/xmm626/xmm626.h" #include "modems/xmm626/xmm626_kernel_smdk4412.h" -#include "modems/xmm626/xmm626_modem_link_device_hsic.h" +#include "modems/xmm626/hsic/xmm626_modem_link_device_hsic.h" #include "modems/xmm626/xmm626_modem_prj.h" int xmm626_kernel_smdk4412_power( @@ -602,3 +602,4 @@ int xmm626_kernel_smdk4412_gprs_get_capabilities( return 0; } + diff --git a/samsung-ipc/modems/xmm626/xmm626_mipi.c b/samsung-ipc/modems/xmm626/mipi/mipi.c index 375ded0..e95d2a1 100644 --- a/samsung-ipc/modems/xmm626/xmm626_mipi.c +++ b/samsung-ipc/modems/xmm626/mipi/mipi.c @@ -29,8 +29,10 @@ #include <samsung-ipc.h> +#include "ipc.h" #include "modems/xmm626/xmm626.h" -#include "modems/xmm626/xmm626_mipi.h" +#include "modems/xmm626/xmm626_kernel_smdk4412.h" +#include "modems/xmm626/mipi/xmm626_mipi.h" int xmm626_mipi_crc_calculate(const void *data, size_t size) { @@ -419,8 +421,8 @@ complete: return rc; } -int xmm626_mipi_modem_data_send(int device_fd, const void *data, size_t size, - int address) +int xmm626_mipi_modem_data_send(struct ipc_client *client, int device_fd, + const void *data, size_t size, int address) { size_t chunk; size_t count; @@ -588,7 +590,7 @@ int xmm626_mipi_firmware_send(struct ipc_client *client, int device_fd, return -1; } - rc = xmm626_mipi_modem_data_send(device_fd, firmware_data, + rc = xmm626_mipi_modem_data_send(client, device_fd, firmware_data, firmware_size, XMM626_FIRMWARE_ADDRESS); if (rc < 0) @@ -617,7 +619,7 @@ int xmm626_mipi_nv_data_send(struct ipc_client *client, int device_fd) } ipc_client_log(client, "Loaded nv_data"); - rc = xmm626_mipi_modem_data_send(device_fd, nv_data, nv_size, + rc = xmm626_mipi_modem_data_send(client, device_fd, nv_data, nv_size, XMM626_NV_DATA_ADDRESS); if (rc < 0) goto error; @@ -645,7 +647,7 @@ int xmm626_mipi_mps_data_send(struct ipc_client *client, int device_fd, return -1; } - rc = xmm626_mipi_modem_data_send(device_fd, mps_data, mps_size, + rc = xmm626_mipi_modem_data_send(client, device_fd, mps_data, mps_size, XMM626_MPS_DATA_ADDRESS); if (rc < 0) return -1; @@ -672,3 +674,29 @@ int xmm626_mipi_hw_reset_send(struct ipc_client *client, int device_fd) return 0; } + +struct ipc_client_modem_driver_ops smdk4412_xmm626_mipi_modem_driver_ops = { + .download_enable = xmm626_kernel_smdk4412_boot_power, //TODO + .power = xmm626_kernel_smdk4412_power, //TODO + .bus_power = xmm626_kernel_smdk4412_hci_power, //TODO + .link_control_enable = xmm626_kernel_smdk4412_link_control_enable, //TODO + .link_control_active = xmm626_kernel_smdk4412_link_control_active, //TODO + .link_connected_wait = xmm626_kernel_smdk4412_link_connected_wait, //TODO + .link_get_hostwake_wait = xmm626_kernel_smdk4412_link_get_hostwake_wait, //TODO + .wait_status_online = xmm626_kernel_smdk4412_status_online_wait, //TODO + + .open = xmm626_kernel_smdk4412_open, //TODO + .close = xmm626_kernel_smdk4412_close, //TODO + .read = xmm626_kernel_smdk4412_read, //TODO + .write = xmm626_kernel_smdk4412_write, //TODO + .poll = xmm626_kernel_smdk4412_poll, //TODO + + .fmt_send = xmm626_kernel_smdk4412_fmt_send, //TODO + .fmt_recv = xmm626_kernel_smdk4412_fmt_recv, //TODO + .rfs_send = xmm626_kernel_smdk4412_rfs_send, //TODO + .rfs_recv = xmm626_kernel_smdk4412_rfs_recv, //TODO + .data_send = xmm626_mipi_modem_data_send, + + // .gprs_get_iface = xmm626_kernel_smdk4412_gprs_get_iface, + // .modem_gprs_get_capabilities = xmm626_kernel_smdk4412_modem_gprs_get_capabilities, +}; diff --git a/samsung-ipc/modems/xmm626/xmm626_mipi.h b/samsung-ipc/modems/xmm626/mipi/xmm626_mipi.h index 1545a3e..67b35ba 100644 --- a/samsung-ipc/modems/xmm626/xmm626_mipi.h +++ b/samsung-ipc/modems/xmm626/mipi/xmm626_mipi.h @@ -67,5 +67,7 @@ int xmm626_mipi_nv_data_send(struct ipc_client *client, int device_fd); int xmm626_mipi_mps_data_send(struct ipc_client *client, int device_fd, const void *mps_data, size_t mps_size); int xmm626_mipi_hw_reset_send(struct ipc_client *client, int device_fd); +int xmm626_mipi_modem_data_send(struct ipc_client *client, int device_fd, + const void *data, size_t size, int address); #endif /* __XMM626_MIPI_H__ */ diff --git a/scripts/smdk4412_func_usage.py b/scripts/smdk4412_func_usage.py new file mode 100755 index 0000000..fe54f66 --- /dev/null +++ b/scripts/smdk4412_func_usage.py @@ -0,0 +1,85 @@ +#!/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) |