2 * This file is part of libsamsung-ipc.
4 * Copyright (C) 2013-2014 Paul Kocialkowski <contact@paulk.fr>
6 * libsamsung-ipc is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 2 of the License, or
9 * (at your option) any later version.
11 * libsamsung-ipc is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with libsamsung-ipc. If not, see <http://www.gnu.org/licenses/>.
26 #include <samsung-ipc.h>
30 #include "xmm626_mipi.h"
31 #include "xmm626_sec_modem.h"
34 int piranha_boot(struct ipc_client *client)
36 void *modem_image_data = NULL;
37 int modem_image_fd = -1;
38 int modem_boot_fd = -1;
45 ipc_client_log(client, "Starting piranha modem boot");
47 modem_image_fd = open(PIRANHA_MODEM_IMAGE_DEVICE, O_RDONLY);
48 if (modem_image_fd < 0) {
49 ipc_client_log(client, "Opening modem image device failed");
52 ipc_client_log(client, "Opened modem image device");
54 modem_image_data = mmap(0, PIRANHA_MODEM_IMAGE_SIZE, PROT_READ, MAP_SHARED, modem_image_fd, 0);
55 if (modem_image_data == NULL || modem_image_data == (void *) 0xffffffff) {
56 ipc_client_log(client, "Mapping modem image data to memory failed");
59 ipc_client_log(client, "Mapped modem image data to memory");
61 modem_boot_fd = open(XMM626_SEC_MODEM_BOOT0_DEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
62 if (modem_boot_fd < 0) {
63 ipc_client_log(client, "Opening modem boot device failed");
66 ipc_client_log(client, "Opened modem boot device");
68 rc = xmm626_sec_modem_power(modem_boot_fd, 0);
70 ipc_client_log(client, "Turning the modem off failed");
73 ipc_client_log(client, "Turned the modem off");
75 rc = xmm626_sec_modem_power(modem_boot_fd, 1);
77 ipc_client_log(client, "Turning the modem on failed");
80 ipc_client_log(client, "Turned the modem on");
82 p = (unsigned char *) modem_image_data + PIRANHA_PSI_OFFSET;
84 rc = xmm626_mipi_psi_send(client, modem_boot_fd, (void *) p, PIRANHA_PSI_SIZE);
86 ipc_client_log(client, "Sending XMM626 MIPI PSI failed");
89 ipc_client_log(client, "Sent XMM626 MIPI PSI");
93 modem_boot_fd = open(XMM626_SEC_MODEM_BOOT1_DEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
94 if (modem_boot_fd < 0) {
95 ipc_client_log(client, "Opening modem boot device failed");
98 ipc_client_log(client, "Opened modem boot device");
100 p = (unsigned char *) modem_image_data + PIRANHA_EBL_OFFSET;
102 rc = xmm626_mipi_ebl_send(client, modem_boot_fd, (void *) p, PIRANHA_EBL_SIZE);
104 ipc_client_log(client, "Sending XMM626 MIPI EBL failed");
107 ipc_client_log(client, "Sent XMM626 MIPI EBL");
109 rc = xmm626_mipi_port_config_send(client, modem_boot_fd);
111 ipc_client_log(client, "Sending XMM626 MIPI port config failed");
114 ipc_client_log(client, "Sent XMM626 MIPI port config");
116 p = (unsigned char *) modem_image_data + PIRANHA_SEC_START_OFFSET;
118 rc = xmm626_mipi_sec_start_send(client, modem_boot_fd, (void *) p, PIRANHA_SEC_START_SIZE);
120 ipc_client_log(client, "Sending XMM626 MIPI SEC start failed");
123 ipc_client_log(client, "Sent XMM626 MIPI SEC start");
125 p = (unsigned char *) modem_image_data + PIRANHA_FIRMWARE_OFFSET;
127 rc = xmm626_mipi_firmware_send(client, modem_boot_fd, (void *) p, PIRANHA_FIRMWARE_SIZE);
129 ipc_client_log(client, "Sending XMM626 MIPI firmware failed");
132 ipc_client_log(client, "Sent XMM626 MIPI firmware");
134 rc = xmm626_mipi_nv_data_send(client, modem_boot_fd);
136 ipc_client_log(client, "Sending XMM626 MIPI nv_data failed");
139 ipc_client_log(client, "Sent XMM626 MIPI nv_data");
141 rc = xmm626_mipi_sec_end_send(client, modem_boot_fd);
143 ipc_client_log(client, "Sending XMM626 MIPI SEC end failed");
146 ipc_client_log(client, "Sent XMM626 MIPI SEC end");
148 rc = xmm626_mipi_hw_reset_send(client, modem_boot_fd);
150 ipc_client_log(client, "Sending XMM626 MIPI HW reset failed");
153 ipc_client_log(client, "Sent XMM626 MIPI HW reset");
162 if (modem_image_data != NULL)
163 munmap(modem_image_data, PIRANHA_MODEM_IMAGE_SIZE);
165 if (modem_image_fd >= 0)
166 close(modem_image_fd);
168 if (modem_boot_fd >= 0)
169 close(modem_boot_fd);
174 int piranha_open(void *data, int type)
176 struct piranha_transport_data *transport_data;
181 transport_data = (struct piranha_transport_data *) data;
183 transport_data->fd = xmm626_sec_modem_open(type);
184 if (transport_data->fd < 0)
190 int piranha_close(void *data)
192 struct piranha_transport_data *transport_data;
197 transport_data = (struct piranha_transport_data *) data;
199 xmm626_sec_modem_close(transport_data->fd);
200 transport_data->fd = -1;
205 int piranha_read(void *data, void *buffer, size_t length)
207 struct piranha_transport_data *transport_data;
213 transport_data = (struct piranha_transport_data *) data;
215 rc = xmm626_sec_modem_read(transport_data->fd, buffer, length);
220 int piranha_write(void *data, const void *buffer, size_t length)
222 struct piranha_transport_data *transport_data;
228 transport_data = (struct piranha_transport_data *) data;
230 rc = xmm626_sec_modem_write(transport_data->fd, buffer, length);
235 int piranha_poll(void *data, struct ipc_poll_fds *fds, struct timeval *timeout)
237 struct piranha_transport_data *transport_data;
243 transport_data = (struct piranha_transport_data *) data;
245 rc = xmm626_sec_modem_poll(transport_data->fd, fds, timeout);
250 int piranha_power_on(void *data)
255 int piranha_power_off(void *data)
260 fd = open(XMM626_SEC_MODEM_BOOT0_DEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
264 rc = xmm626_sec_modem_power(fd, 0);
274 int piranha_gprs_activate(void *data, unsigned int cid)
279 int piranha_gprs_deactivate(void *data, unsigned int cid)
284 int piranha_data_create(void **transport_data, void **power_data,
287 if (transport_data == NULL)
290 *transport_data = calloc(1, sizeof(struct piranha_transport_data));
295 int piranha_data_destroy(void *transport_data, void *power_data,
298 if (transport_data == NULL)
301 free(transport_data);
306 struct ipc_client_ops piranha_fmt_ops = {
307 .boot = piranha_boot,
308 .send = xmm626_sec_modem_fmt_send,
309 .recv = xmm626_sec_modem_fmt_recv,
312 struct ipc_client_ops piranha_rfs_ops = {
314 .send = xmm626_sec_modem_rfs_send,
315 .recv = xmm626_sec_modem_rfs_recv,
318 struct ipc_client_handlers piranha_handlers = {
319 .read = piranha_read,
320 .write = piranha_write,
321 .open = piranha_open,
322 .close = piranha_close,
323 .poll = piranha_poll,
324 .transport_data = NULL,
325 .power_on = piranha_power_on,
326 .power_off = piranha_power_off,
328 .gprs_activate = piranha_gprs_activate,
329 .gprs_deactivate = piranha_gprs_deactivate,
331 .data_create = piranha_data_create,
332 .data_destroy = piranha_data_destroy,
335 struct ipc_client_gprs_specs piranha_gprs_specs = {
336 .gprs_get_iface = xmm626_sec_modem_gprs_get_iface,
337 .gprs_get_capabilities = xmm626_sec_modem_gprs_get_capabilities,
340 struct ipc_client_nv_data_specs piranha_nv_data_specs = {
341 .nv_data_path = XMM626_NV_DATA_PATH,
342 .nv_data_md5_path = XMM626_NV_DATA_MD5_PATH,
343 .nv_data_backup_path = XMM626_NV_DATA_BACKUP_PATH,
344 .nv_data_backup_md5_path = XMM626_NV_DATA_BACKUP_MD5_PATH,
345 .nv_data_secret = XMM626_NV_DATA_SECRET,
346 .nv_data_size = XMM626_NV_DATA_SIZE,
347 .nv_data_chunk_size = XMM626_NV_DATA_CHUNK_SIZE,
350 // vim:ts=4:sw=4:expandtab