2 * This file is part of libsamsung-ipc.
4 * Copyright (C) 2012 Alexander Tarasikov <alexander.tarasikov@gmail.com>
5 * Copyright (C) 2013-2014 Paul Kocialkowski <contact@paulk.fr>
7 * libsamsung-ipc is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 2 of the License, or
10 * (at your option) any later version.
12 * libsamsung-ipc is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with libsamsung-ipc. If not, see <http://www.gnu.org/licenses/>.
27 #include <samsung-ipc.h>
31 #include "xmm626_mipi.h"
32 #include "xmm626_sec_modem.h"
35 int maguro_boot(struct ipc_client *client)
37 void *modem_image_data = NULL;
38 int modem_image_fd = -1;
39 int modem_boot_fd = -1;
40 void *mps_data = NULL;
47 ipc_client_log(client, "Starting maguro modem boot");
49 modem_image_fd = open(MAGURO_MODEM_IMAGE_DEVICE, O_RDONLY);
50 if (modem_image_fd < 0) {
51 ipc_client_log(client, "Opening modem image device failed");
54 ipc_client_log(client, "Opened modem image device");
56 modem_image_data = mmap(0, MAGURO_MODEM_IMAGE_SIZE, PROT_READ, MAP_SHARED, modem_image_fd, 0);
57 if (modem_image_data == NULL || modem_image_data == (void *) 0xffffffff) {
58 ipc_client_log(client, "Mapping modem image data to memory failed");
61 ipc_client_log(client, "Mapped modem image data to memory");
63 modem_boot_fd = open(XMM626_SEC_MODEM_BOOT0_DEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
64 if (modem_boot_fd < 0) {
65 ipc_client_log(client, "Opening modem boot device failed");
68 ipc_client_log(client, "Opened modem boot device");
70 rc = xmm626_sec_modem_power(modem_boot_fd, 0);
72 ipc_client_log(client, "Turning the modem off failed");
75 ipc_client_log(client, "Turned the modem off");
77 rc = xmm626_sec_modem_power(modem_boot_fd, 1);
79 ipc_client_log(client, "Turning the modem on failed");
82 ipc_client_log(client, "Turned the modem on");
84 p = (unsigned char *) modem_image_data + MAGURO_PSI_OFFSET;
86 rc = xmm626_mipi_psi_send(client, modem_boot_fd, (void *) p, MAGURO_PSI_SIZE);
88 ipc_client_log(client, "Sending XMM626 MIPI PSI failed");
91 ipc_client_log(client, "Sent XMM626 MIPI PSI");
95 modem_boot_fd = open(XMM626_SEC_MODEM_BOOT1_DEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
96 if (modem_boot_fd < 0) {
97 ipc_client_log(client, "Opening modem boot device failed");
100 ipc_client_log(client, "Opened modem boot device");
102 p = (unsigned char *) modem_image_data + MAGURO_EBL_OFFSET;
104 rc = xmm626_mipi_ebl_send(client, modem_boot_fd, (void *) p, MAGURO_EBL_SIZE);
106 ipc_client_log(client, "Sending XMM626 MIPI EBL failed");
109 ipc_client_log(client, "Sent XMM626 MIPI EBL");
111 rc = xmm626_mipi_port_config_send(client, modem_boot_fd);
113 ipc_client_log(client, "Sending XMM626 MIPI port config failed");
116 ipc_client_log(client, "Sent XMM626 MIPI port config");
118 p = (unsigned char *) modem_image_data + MAGURO_SEC_START_OFFSET;
120 rc = xmm626_mipi_sec_start_send(client, modem_boot_fd, (void *) p, MAGURO_SEC_START_SIZE);
122 ipc_client_log(client, "Sending XMM626 MIPI SEC start failed");
125 ipc_client_log(client, "Sent XMM626 MIPI SEC start");
127 p = (unsigned char *) modem_image_data + MAGURO_FIRMWARE_OFFSET;
129 rc = xmm626_mipi_firmware_send(client, modem_boot_fd, (void *) p, MAGURO_FIRMWARE_SIZE);
131 ipc_client_log(client, "Sending XMM626 MIPI firmware failed");
134 ipc_client_log(client, "Sent XMM626 MIPI firmware");
136 rc = xmm626_mipi_nv_data_send(client, modem_boot_fd);
138 ipc_client_log(client, "Sending XMM626 MIPI nv_data failed");
141 ipc_client_log(client, "Sent XMM626 MIPI nv_data");
143 mps_data = file_data_read(MAGURO_MPS_DATA_DEVICE, MAGURO_MPS_DATA_SIZE, MAGURO_MPS_DATA_SIZE, 0);
144 if (mps_data == NULL) {
145 ipc_client_log(client, "Reading MPS data failed");
148 ipc_client_log(client, "Read MPS data");
150 rc = xmm626_mipi_mps_data_send(client, modem_boot_fd, mps_data, MAGURO_MPS_DATA_SIZE);
152 ipc_client_log(client, "Sending XMM626 MIPI MPS data failed");
155 ipc_client_log(client, "Sent XMM626 MIPI MPS data");
157 rc = xmm626_mipi_sec_end_send(client, modem_boot_fd);
159 ipc_client_log(client, "Sending XMM626 MIPI SEC end failed");
162 ipc_client_log(client, "Sent XMM626 MIPI SEC end");
164 rc = xmm626_mipi_hw_reset_send(client, modem_boot_fd);
166 ipc_client_log(client, "Sending XMM626 MIPI HW reset failed");
169 ipc_client_log(client, "Sent XMM626 MIPI HW reset");
171 rc = xmm626_sec_modem_status_online_wait(modem_boot_fd);
173 ipc_client_log(client, "Waiting for online status failed");
176 ipc_client_log(client, "Waited for online status");
178 rc = xmm626_sec_modem_boot_power(modem_boot_fd, 0);
180 ipc_client_log(client, "Turning modem boot off failed");
183 ipc_client_log(client, "Turned modem boot off");
192 if (mps_data != NULL)
195 if (modem_image_data != NULL)
196 munmap(modem_image_data, MAGURO_MODEM_IMAGE_SIZE);
198 if (modem_image_fd >= 0)
199 close(modem_image_fd);
201 if (modem_boot_fd >= 0)
202 close(modem_boot_fd);
207 int maguro_open(void *data, int type)
209 struct maguro_transport_data *transport_data;
214 transport_data = (struct maguro_transport_data *) data;
216 transport_data->fd = xmm626_sec_modem_open(type);
217 if (transport_data->fd < 0)
223 int maguro_close(void *data)
225 struct maguro_transport_data *transport_data;
230 transport_data = (struct maguro_transport_data *) data;
232 xmm626_sec_modem_close(transport_data->fd);
233 transport_data->fd = -1;
238 int maguro_read(void *data, void *buffer, size_t length)
240 struct maguro_transport_data *transport_data;
246 transport_data = (struct maguro_transport_data *) data;
248 rc = xmm626_sec_modem_read(transport_data->fd, buffer, length);
253 int maguro_write(void *data, const void *buffer, size_t length)
255 struct maguro_transport_data *transport_data;
261 transport_data = (struct maguro_transport_data *) data;
263 rc = xmm626_sec_modem_write(transport_data->fd, buffer, length);
268 int maguro_poll(void *data, struct timeval *timeout)
270 struct maguro_transport_data *transport_data;
276 transport_data = (struct maguro_transport_data *) data;
278 rc = xmm626_sec_modem_poll(transport_data->fd, timeout);
283 int maguro_power_on(void *data)
288 int maguro_power_off(void *data)
293 fd = open(XMM626_SEC_MODEM_BOOT0_DEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
297 rc = xmm626_sec_modem_power(fd, 0);
307 int maguro_gprs_activate(void *data, unsigned int cid)
312 int maguro_gprs_deactivate(void *data, unsigned int cid)
317 int maguro_data_create(void **transport_data, void **power_data,
320 if (transport_data == NULL)
323 *transport_data = calloc(1, sizeof(struct maguro_transport_data));
328 int maguro_data_destroy(void *transport_data, void *power_data,
331 if (transport_data == NULL)
334 free(transport_data);
339 struct ipc_client_ops maguro_fmt_ops = {
341 .send = xmm626_sec_modem_fmt_send,
342 .recv = xmm626_sec_modem_fmt_recv,
345 struct ipc_client_ops maguro_rfs_ops = {
347 .send = xmm626_sec_modem_rfs_send,
348 .recv = xmm626_sec_modem_rfs_recv,
351 struct ipc_client_handlers maguro_handlers = {
353 .write = maguro_write,
355 .close = maguro_close,
357 .transport_data = NULL,
358 .power_on = maguro_power_on,
359 .power_off = maguro_power_off,
361 .gprs_activate = maguro_gprs_activate,
362 .gprs_deactivate = maguro_gprs_deactivate,
364 .data_create = maguro_data_create,
365 .data_destroy = maguro_data_destroy,
368 struct ipc_client_gprs_specs maguro_gprs_specs = {
369 .gprs_get_iface = xmm626_sec_modem_gprs_get_iface,
370 .gprs_get_capabilities = xmm626_sec_modem_gprs_get_capabilities,
373 struct ipc_client_nv_data_specs maguro_nv_data_specs = {
374 .nv_data_path = MAGURO_NV_DATA_PATH,
375 .nv_data_md5_path = MAGURO_NV_DATA_MD5_PATH,
376 .nv_data_backup_path = MAGURO_NV_DATA_BACKUP_PATH,
377 .nv_data_backup_md5_path = MAGURO_NV_DATA_BACKUP_MD5_PATH,
378 .nv_data_secret = XMM626_NV_DATA_SECRET,
379 .nv_data_size = XMM626_NV_DATA_SIZE,
380 .nv_data_chunk_size = XMM626_NV_DATA_CHUNK_SIZE,
383 // vim:ts=4:sw=4:expandtab