aboutsummaryrefslogtreecommitdiffstats
path: root/samsung-ipc/crespo_ipc.c
diff options
context:
space:
mode:
Diffstat (limited to 'samsung-ipc/crespo_ipc.c')
-rw-r--r--samsung-ipc/crespo_ipc.c683
1 files changed, 269 insertions, 414 deletions
diff --git a/samsung-ipc/crespo_ipc.c b/samsung-ipc/crespo_ipc.c
index feb4964..be97609 100644
--- a/samsung-ipc/crespo_ipc.c
+++ b/samsung-ipc/crespo_ipc.c
@@ -2,7 +2,8 @@
* This file is part of libsamsung-ipc.
*
* Copyright (C) 2011 Paul Kocialkowski <contact@paulk.fr>
- * Copyright (C) 2011 Joerie de Gram <j.de.gram@gmail.com>
+ * Joerie de Gram <j.de.gram@gmail.com>
+ * Simon Busch <morphis@gravedo.de>
*
* 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
@@ -16,7 +17,6 @@
*
* 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 <stdio.h>
@@ -32,6 +32,7 @@
#include <sys/types.h>
#include <asm/types.h>
#include <mtd/mtd-abi.h>
+#include <assert.h>
#include <radio.h>
@@ -40,507 +41,361 @@
#include "crespo_ipc.h"
#include "ipc_private.h"
-int s3c2410_serial3_fd= -1;
-int modem_ctl_fd= -1;
-int modem_fmt_fd= -1;
-int modem_rfs_fd= -1;
-int wake_lock_fd= -1;
-int wake_unlock_fd= -1;
+int wake_lock_fd= -1;
+int wake_unlock_fd= -1;
-void *mtd_read(char *mtd_name, int size, int block_size)
+int crespo_modem_bootstrap(struct ipc_client *client)
{
- void *mtd_p=NULL;
- uint8_t *data_p=NULL;
-
- loff_t offs;
- int fd;
- int i;
-
- if(mtd_name == NULL || size <= 0 || block_size <= 0)
- goto error;
-
- printf("mtd_read: reading 0x%x bytes from %s with 0x%x bytes block size\n", size, mtd_name, block_size);
-
- mtd_p=malloc(size);
- if(mtd_p == NULL)
- goto error;
-
- memset(mtd_p, 0, size);
-
- data_p=(uint8_t *) mtd_p;
-
- fd=open(mtd_name, O_RDONLY);
- if(fd < 0)
- goto error;
-
- for(i=0 ; i < size / block_size ; i++)
- {
- offs=i * block_size;
- if(ioctl(fd, MEMGETBADBLOCK, &offs) == 1)
- {
- printf("mtd_read: warning: bad block at offset %lld\n", offs);
- data_p+=block_size;
- continue;
- }
-
- read(fd, data_p, block_size);
- data_p+=block_size;
- }
-
- close(fd);
-
- return mtd_p;
-
-error:
- printf("%s: something went wrong\n", __func__);
- return NULL;
-}
-
-void *file_read(char *file_name, int size, int block_size)
-{
- void *file_p=NULL;
- uint8_t *data_p=NULL;
-
- int fd;
- int i;
-
- if(file_name == NULL || size <= 0 || block_size <= 0)
- goto error;
-
- printf("file_read: reading 0x%x bytes from %s with 0x%x bytes block size\n", size, file_name, block_size);
-
- file_p=malloc(size);
- if(file_p == NULL)
- goto error;
-
- memset(file_p, 0, size);
-
- data_p=(uint8_t *) file_p;
-
- fd=open(file_name, O_RDONLY);
- if(fd < 0)
- goto error;
-
- for(i=0 ; i < size / block_size ; i++)
- {
- read(fd, data_p, block_size);
- data_p+=block_size;
- }
-
- close(fd);
-
- return file_p;
+ int s3c2410_serial3_fd= -1;
+ int modem_ctl_fd= -1;
-error:
- printf("%s: something went wrong\n", __func__);
- return NULL;
-}
-
-int crespo_ipc_bootstrap(void)
-{
- /* Control variables. */
- int boot_tries_count=0;
- int rc=0;
+ /* Control variables. */
+ int boot_tries_count=0;
+ int rc=0;
- /* Boot variables */
- uint8_t *radio_img_p=NULL;
- uint8_t bootcore_version=0;
- uint8_t info_size=0;
- uint8_t crc_byte=0;
- int block_size=0;
+ /* Boot variables */
+ uint8_t *radio_img_p=NULL;
+ uint8_t bootcore_version=0;
+ uint8_t info_size=0;
+ uint8_t crc_byte=0;
+ int block_size=0;
- /* s3c2410 serial setup variables. */
- struct termios termios;
- int serial;
+ /* s3c2410 serial setup variables. */
+ struct termios termios;
+ int serial;
- /* fds maniplation variables */
- struct timeval timeout;
- fd_set fds;
+ /* fds maniplation variables */
+ struct timeval timeout;
+ fd_set fds;
- /* nv_data variables */
- void *nv_data_p;
+ /* nv_data variables */
+ void *nv_data_p;
- /* General purpose variables. */
- uint8_t data;
- uint16_t data_16;
- uint8_t *data_p;
- int i;
+ /* General purpose variables. */
+ uint8_t data;
+ uint16_t data_16;
+ uint8_t *data_p;
+ int i;
- printf("crespo_ipc_bootstrap: enter\n");
+ printf("crespo_ipc_bootstrap: enter\n");
boot_loop_start:
- if(boot_tries_count > 5)
- {
- printf("crespo_ipc_bootstrap: boot has failed too many times.\n");
- goto error;
- }
+ if(boot_tries_count > 5)
+ {
+ printf("crespo_ipc_bootstrap: boot has failed too many times.\n");
+ goto error;
+ }
- /* Read the radio.img image. */
- printf("crespo_ipc_bootstrap: reading radio image\n");
- radio_img_p=mtd_read("/dev/mtd/mtd5ro", RADIO_IMG_SIZE, 0x1000);
- printf("crespo_ipc_bootstrap: radio image read\n");
-
- printf("crespo_ipc_bootstrap: open modem_ctl\n");
- modem_ctl_fd=open("/dev/modem_ctl", O_RDWR | O_NDELAY);
- if(modem_ctl_fd < 0)
- goto error_loop;
+ /* Read the radio.img image. */
+ printf("crespo_ipc_bootstrap: reading radio image\n");
+ radio_img_p=mtd_read("/dev/mtd/mtd5ro", RADIO_IMG_SIZE, 0x1000);
+ printf("crespo_ipc_bootstrap: radio image read\n");
+
+ printf("crespo_ipc_bootstrap: open modem_ctl\n");
+ modem_ctl_fd=open("/dev/modem_ctl", O_RDWR | O_NDELAY);
+ if(modem_ctl_fd < 0)
+ goto error_loop;
- /* Reset the modem before init to send the first part of modem.img. */
- ioctl(modem_ctl_fd, IOCTL_MODEM_RESET);
- usleep(400000);
-
- printf("crespo_ipc_bootstrap: open s3c2410_serial3\n");
- s3c2410_serial3_fd=open("/dev/s3c2410_serial3", O_RDWR | O_NDELAY);
- if(s3c2410_serial3_fd < 0)
- goto error_loop;
-
- /* Setup the s3c2410 serial. */
- printf("crespo_ipc_bootstrap: setup s3c2410_serial3\n");
- tcgetattr(s3c2410_serial3_fd, &termios);
-
- cfmakeraw(&termios);
- cfsetispeed(&termios, B115200);
- cfsetospeed(&termios, B115200);
-
- tcsetattr(s3c2410_serial3_fd, TCSANOW, &termios);
-
- ioctl(s3c2410_serial3_fd, TIOCMGET, &serial); //FIXME
- ioctl(s3c2410_serial3_fd, TIOCMSET, &serial); //FIXME
-
- tcgetattr(s3c2410_serial3_fd, &termios); //FIXME
- tcsetattr(s3c2410_serial3_fd, TCSANOW, &termios); //FIXME
-
- /* Send 'AT' in ASCII. */
- printf("crespo_ipc_bootstrap: sending AT in ASCII\n");
- for(i=0 ; i < 20 ; i++)
- {
- write(s3c2410_serial3_fd, "AT", 2);
- usleep(50000);
- }
- printf("crespo_ipc_bootstrap: sending AT in ASCII done\n");
+ /* Reset the modem before init to send the first part of modem.img. */
+ ioctl(modem_ctl_fd, IOCTL_MODEM_RESET);
+ usleep(400000);
+
+ printf("crespo_ipc_bootstrap: open s3c2410_serial3\n");
+ s3c2410_serial3_fd=open("/dev/s3c2410_serial3", O_RDWR | O_NDELAY);
+ if(s3c2410_serial3_fd < 0)
+ goto error_loop;
+
+ /* Setup the s3c2410 serial. */
+ printf("crespo_ipc_bootstrap: setup s3c2410_serial3\n");
+ tcgetattr(s3c2410_serial3_fd, &termios);
+
+ cfmakeraw(&termios);
+ cfsetispeed(&termios, B115200);
+ cfsetospeed(&termios, B115200);
+
+ tcsetattr(s3c2410_serial3_fd, TCSANOW, &termios);
+
+ ioctl(s3c2410_serial3_fd, TIOCMGET, &serial); //FIXME
+ ioctl(s3c2410_serial3_fd, TIOCMSET, &serial); //FIXME
+
+ tcgetattr(s3c2410_serial3_fd, &termios); //FIXME
+ tcsetattr(s3c2410_serial3_fd, TCSANOW, &termios); //FIXME
+
+ /* Send 'AT' in ASCII. */
+ printf("crespo_ipc_bootstrap: sending AT in ASCII\n");
+ for(i=0 ; i < 20 ; i++)
+ {
+ rc = write(s3c2410_serial3_fd, "AT", 2);
+ usleep(50000);
+ }
+ printf("crespo_ipc_bootstrap: sending AT in ASCII done\n");
- usleep(50000); //FIXME
-
- /* Get and check bootcore version. */
- read(s3c2410_serial3_fd, &bootcore_version, sizeof(bootcore_version));
- printf("crespo_ipc_bootstrap: got bootcore version: 0x%x\n", bootcore_version);
-
- if(bootcore_version != BOOTCORE_VERSION)
- goto error_loop;
-
- /* Get info_size. */
- read(s3c2410_serial3_fd, &info_size, sizeof(info_size));
- printf("crespo_ipc_bootstrap: got info_size: 0x%x\n", info_size);
+ usleep(50000); //FIXME
+
+ /* Get and check bootcore version. */
+ read(s3c2410_serial3_fd, &bootcore_version, sizeof(bootcore_version));
+ printf("crespo_ipc_bootstrap: got bootcore version: 0x%x\n", bootcore_version);
+
+ if(bootcore_version != BOOTCORE_VERSION)
+ goto error_loop;
+
+ /* Get info_size. */
+ read(s3c2410_serial3_fd, &info_size, sizeof(info_size));
+ printf("crespo_ipc_bootstrap: got info_size: 0x%x\n", info_size);
- /* Send PSI magic. */
- data=PSI_MAGIC;
- write(s3c2410_serial3_fd, &data, sizeof(data));
- printf("crespo_ipc_bootstrap: sent PSI_MAGIC (0x%x)\n", PSI_MAGIC);
+ /* Send PSI magic. */
+ data=PSI_MAGIC;
+ write(s3c2410_serial3_fd, &data, sizeof(data));
+ printf("crespo_ipc_bootstrap: sent PSI_MAGIC (0x%x)\n", PSI_MAGIC);
- /* Send PSI data len. */
- data_16=PSI_DATA_LEN;
- data_p=(uint8_t *)&data_16;
+ /* Send PSI data len. */
+ data_16=PSI_DATA_LEN;
+ data_p=(uint8_t *)&data_16;
- for(i=0 ; i < 2 ; i++)
- {
- write(s3c2410_serial3_fd, data_p, 1);
- data_p++;
- }
- printf("crespo_ipc_bootstrap: sent PSI_DATA_LEN (0x%x)\n", PSI_DATA_LEN);
+ for(i=0 ; i < 2 ; i++)
+ {
+ write(s3c2410_serial3_fd, data_p, 1);
+ data_p++;
+ }
+ printf("crespo_ipc_bootstrap: sent PSI_DATA_LEN (0x%x)\n", PSI_DATA_LEN);
- /* Write the first part of modem.img. */
- FD_ZERO(&fds);
- FD_SET(s3c2410_serial3_fd, &fds);
+ /* Write the first part of modem.img. */
+ FD_ZERO(&fds);
+ FD_SET(s3c2410_serial3_fd, &fds);
- timeout.tv_sec=4;
- timeout.tv_usec=0;
+ timeout.tv_sec=4;
+ timeout.tv_usec=0;
- data_p=radio_img_p;
+ data_p=radio_img_p;
- printf("crespo_ipc_bootstrap: sending the first part of radio.img\n");
+ printf("crespo_ipc_bootstrap: sending the first part of radio.img\n");
- for(i=0 ; i < PSI_DATA_LEN ; i++)
- {
- if(select(FD_SETSIZE, NULL, &fds, NULL, &timeout) == 0)
- {
- printf("crespo_ipc_bootstrap: select timeout passed\n");
- goto error_loop;
- }
+ for(i=0 ; i < PSI_DATA_LEN ; i++)
+ {
+ if(select(FD_SETSIZE, NULL, &fds, NULL, &timeout) == 0)
+ {
+ printf("crespo_ipc_bootstrap: select timeout passed\n");
+ goto error_loop;
+ }
- write(s3c2410_serial3_fd, data_p, 1);
- crc_byte=crc_byte ^ *data_p;
+ write(s3c2410_serial3_fd, data_p, 1);
+ crc_byte=crc_byte ^ *data_p;
- data_p++;
- }
+ data_p++;
+ }
- printf("crespo_ipc_bootstrap: first part of radio.img sent; crc_byte is 0x%x\n", crc_byte);
+ printf("crespo_ipc_bootstrap: first part of radio.img sent; crc_byte is 0x%x\n", crc_byte);
- if(select(FD_SETSIZE, NULL, &fds, NULL, &timeout) == 0)
- {
- printf("crespo_ipc_bootstrap: select timeout passed\n");
- goto error_loop;
- }
+ if(select(FD_SETSIZE, NULL, &fds, NULL, &timeout) == 0)
+ {
+ printf("crespo_ipc_bootstrap: select timeout passed\n");
+ goto error_loop;
+ }
- write(s3c2410_serial3_fd, &crc_byte, sizeof(crc_byte));
+ write(s3c2410_serial3_fd, &crc_byte, sizeof(crc_byte));
- printf("crespo_ipc_bootstrap: crc_byte sent\n");
+ printf("crespo_ipc_bootstrap: crc_byte sent\n");
- data=0;
- for(i=0 ; data != 0x01 ; i++)
- {
- if(select(FD_SETSIZE, &fds, NULL, NULL, &timeout) == 0)
- {
- printf("crespo_ipc_bootstrap: select timeout passed\n");
- goto error_loop;
- }
+ data = 0;
+ for(i = 0 ; data != 0x01 ; i++)
+ {
+ if(select(FD_SETSIZE, &fds, NULL, NULL, &timeout) == 0)
+ {
+ printf("crespo_ipc_bootstrap: select timeout passed\n");
+ goto error_loop;
+ }
- read(s3c2410_serial3_fd, &data, sizeof(data));
+ read(s3c2410_serial3_fd, &data, sizeof(data));
- if(i > 50)
- {
- printf("crespo_ipc_bootstrap: fairly too much attempts to get ACK\n");
- goto error_loop;
- }
- }
+ if(i > 50)
+ {
+ printf("crespo_ipc_bootstrap: fairly too much attempts to get ACK\n");
+ goto error_loop;
+ }
+ }
- printf("crespo_ipc_bootstrap: close s3c2410_serial3\n");
- close(s3c2410_serial3_fd);
+ printf("crespo_ipc_bootstrap: close s3c2410_serial3\n");
+ close(s3c2410_serial3_fd);
- printf("crespo_ipc_bootstrap: writing the rest of radio.img to modem_ctl.\n");
- /* Seek to the begining of modem_ctl_fd (should already be so). */
- lseek(modem_ctl_fd, 0, SEEK_SET);
+ printf("crespo_ipc_bootstrap: writing the rest of radio.img to modem_ctl.\n");
+ /* Seek to the begining of modem_ctl_fd (should already be so). */
+ lseek(modem_ctl_fd, 0, SEEK_SET);
- /* Pointer to the remaining part of radio.img. */
- data_p=radio_img_p + PSI_DATA_LEN;
+ /* Pointer to the remaining part of radio.img. */
+ data_p=radio_img_p + PSI_DATA_LEN;
- FD_ZERO(&fds);
- FD_SET(modem_ctl_fd, &fds);
+ FD_ZERO(&fds);
+ FD_SET(modem_ctl_fd, &fds);
- block_size=0x100000;
+ block_size = 0x100000;
- for(i=0 ; i < (RADIO_IMG_SIZE - PSI_DATA_LEN) / block_size ; i++)
- {
- if(select(FD_SETSIZE, NULL, &fds, NULL, &timeout) == 0)
- {
- printf("crespo_ipc_bootstrap: select timeout passed\n");
- goto error_loop;
- }
+ for(i=0 ; i < (RADIO_IMG_SIZE - PSI_DATA_LEN) / block_size ; i++)
+ {
+ if(select(FD_SETSIZE, NULL, &fds, NULL, &timeout) == 0)
+ {
+ printf("crespo_ipc_bootstrap: select timeout passed\n");
+ goto error_loop;
+ }
- write(modem_ctl_fd, data_p, block_size);
- data_p+=block_size;
- }
+ write(modem_ctl_fd, data_p, block_size);
+ data_p += block_size;
+ }
- free(radio_img_p);
+ free(radio_img_p);
- /* nv_data part. */
+ /* nv_data part. */
- /* Check if all the nv_data files are ok. */
- nv_data_check();
+ /* Check if all the nv_data files are ok. */
+ nv_data_check();
- /* Check if the MD5 is ok. */
- nv_data_md5_check();
+ /* Check if the MD5 is ok. */
+ nv_data_md5_check();
- /* Write nv_data.bin to modem_ctl. */
- printf("crespo_ipc_bootstrap: write nv_data to modem_ctl\n");
+ /* Write nv_data.bin to modem_ctl. */
+ printf("crespo_ipc_bootstrap: write nv_data to modem_ctl\n");
- nv_data_p=file_read("/efs/nv_data.bin", NV_DATA_SIZE, 1024);
- data_p=nv_data_p;
+ nv_data_p = file_read("/efs/nv_data.bin", NV_DATA_SIZE, 1024);
+ data_p = nv_data_p;
- lseek(modem_ctl_fd, RADIO_IMG_SIZE, SEEK_SET);
+ lseek(modem_ctl_fd, RADIO_IMG_SIZE, SEEK_SET);
- for(i=0 ; i < 2 ; i++)
- {
- write(modem_ctl_fd, data_p, NV_DATA_SIZE / 2);
- data_p+=NV_DATA_SIZE / 2;
- }
+ for(i=0 ; i < 2 ; i++)
+ {
+ write(modem_ctl_fd, data_p, NV_DATA_SIZE / 2);
+ data_p += NV_DATA_SIZE / 2;
+ }
- free(nv_data_p);
+ free(nv_data_p);
- rc=0;
- goto exit;
+ rc = 0;
+ goto exit;
error_loop:
- printf("%s: something went wrong\n", __func__);
- boot_tries_count++;
- sleep(2);
+ printf("%s: something went wrong\n", __func__);
+ boot_tries_count++;
+ sleep(2);
- goto boot_loop_start;
+ goto boot_loop_start;
error:
- printf("%s: something went wrong\n", __func__);
- rc=1;
+ printf("%s: something went wrong\n", __func__);
+ rc = 1;
exit:
- printf("crespo_ipc_bootstrap: exit\n");
- return rc;
+ printf("crespo_ipc_bootstrap: exit\n");
+ return rc;
}
-int crespo_ipc_open(void)
+int crespo_ipc_client_send(struct ipc_client *client, struct ipc_request *request)
{
- modem_fmt_fd = open("/dev/modem_fmt", O_RDWR | O_NDELAY);
-#if 0
- modem_rfs_fd=open("/dev/modem_rfs", O_RDWR | O_NDELAY);
-#endif
- return modem_fmt_fd > 0 ? 0 : -1;
-}
+ struct modem_io modem_data;
+ struct ipc_header reqhdr;
+ int rc = 0;
-void crespo_ipc_fd_set(int fd)
-{
- modem_fmt_fd = fd;
-}
+ memset(&modem_data, 0, sizeof(struct modem_io));
+ modem_data.data = malloc(MAX_MODEM_DATA_SIZE);
+ modem_data.size = request->length + sizeof(struct ipc_header);
-int crespo_ipc_close(void)
-{
- close(modem_fmt_fd);
-#if 0
- close(modem_rfs_fd);
-#endif
- close(modem_ctl_fd);
+ reqhdr.mseq = request->mseq;
+ reqhdr.aseq = request->aseq;
+ reqhdr.group = request->group;
+ reqhdr.index = request->index;
+ reqhdr.type = request->type;
+ reqhdr.length = (uint16_t) (request->length + sizeof(struct ipc_header));
- return 0;
-}
+ modem_data.data = malloc(reqhdr.length);
-void crespo_ipc_power_on(void)
-{
- ioctl(modem_ctl_fd, IOCTL_MODEM_START);
-}
+ memcpy(modem_data.data, &reqhdr, sizeof(struct ipc_header));
+ // modem_data.data += sizeof(struct ipc_header);
+ memcpy(modem_data.data + sizeof(struct ipc_header), request->data, request->length);
-void crespo_ipc_power_off(void)
-{
- ioctl(modem_ctl_fd, IOCTL_MODEM_OFF);
-}
+ assert(client->write != NULL);
-int crespo_ipc_fd_get(void)
-{
- return modem_fmt_fd;
+ rc = client->write((uint8_t*) &modem_data, sizeof(struct modem_io), client->write_data);
+ return rc;
}
-void crespo_ipc_send(struct ipc_request *request)
+int wake_lock(char *lock_name, int size)
{
- struct modem_io modem_data;
- struct ipc_header hdlc_data;
- uint8_t *data_p;
+ int rc = 0;
- memset(&modem_data, 0, sizeof(struct modem_io));
- modem_data.data=malloc(0x1000);
- modem_data.size=request->length + sizeof(struct ipc_header);
+ wake_lock_fd = open("/sys/power/wake_lock", O_RDWR);
+ rc = write(wake_lock_fd, lock_name, size);
+ close(wake_lock_fd);
- hdlc_data.mseq=request->mseq;
- hdlc_data.aseq=request->aseq;
- hdlc_data.group=request->group;
- hdlc_data.index=request->index;
- hdlc_data.type=request->type;
- hdlc_data.length=(uint16_t) (request->length + sizeof(struct ipc_header));
-
- modem_data.data=malloc(hdlc_data.length);
- data_p=modem_data.data;
-
- memcpy(data_p, &hdlc_data, sizeof(struct ipc_header));
- data_p+=sizeof(struct ipc_header);
- memcpy(data_p, request->data, request->length);
-
- ioctl(modem_fmt_fd, IOCTL_MODEM_SEND, &modem_data);
+ return rc;
}
-void wake_lock(char *lock_name, int size)
+int wake_unlock(char *lock_name, int size)
{
- if(wake_lock_fd < 0)
- wake_lock_fd=open("/sys/power/wake_lock", O_RDWR);
+ int rc = 0;
- write(wake_lock_fd, lock_name, size);
-}
+ wake_lock_fd = open("/sys/power/wake_unlock", O_RDWR);
+ rc = write(wake_unlock_fd, lock_name, size);
+ close(wake_unlock_fd);
-void wake_unlock(char *lock_name, int size)
-{
- if(wake_unlock_fd < 0)
- wake_lock_fd=open("/sys/power/wake_unlock", O_RDWR);
-
- write(wake_unlock_fd, lock_name, size);
+ return rc;
}
-int crespo_ipc_recv(struct ipc_response *response)
+int crespo_ipc_client_recv(struct ipc_client *client, struct ipc_response *response)
{
- struct modem_io modem_data;
- struct ipc_header *hdlc_data;
-
- fd_set fds;
+ struct modem_io modem_data;
+ struct ipc_header *resphdr;
+ int bread = 0;
-recv_loop_start:
- memset(&modem_data, 0, sizeof(struct modem_io));
- modem_data.data=malloc(0x1000);
- modem_data.size=0x1000;
+ memset(&modem_data, 0, sizeof(struct modem_io));
+ modem_data.data = malloc(MAX_MODEM_DATA_SIZE);
+ modem_data.size = MAX_MODEM_DATA_SIZE;
- memset(response, 0, sizeof(struct ipc_response));
+ memset(response, 0, sizeof(struct ipc_response));
- /* TODO: Should be with the wakelocks. */
+ wake_lock("secril_fmt-interface", sizeof("secril_fmt-interface") - 1); // FIXME sizeof("...") is ugly!
- wake_lock("secril_fmt-interface", sizeof("secril_fmt-interface") - 1);
+ assert(client->read != NULL);
+ bread = client->read((uint8_t*) &modem_data, sizeof(struct modem_io) + MAX_MODEM_DATA_SIZE, client->read_data);
+ if (bread <= 0)
+ {
+ printf("ERROR: crespo_ipc_client_recv: can't receive enough bytes from modem to process incoming response!\n");
+ return 1;
+ }
- FD_ZERO(&fds);
- FD_SET(modem_fmt_fd, &fds);
+ printf("ERROR: crespo_ipc_client_recv: Modem RECV FMT (id=%d cmd=%d size=%d)!\n", modem_data.id, modem_data.cmd, modem_data.size);
-#if 0
- FD_SET(modem_rfs_fd, &fds);
+ if(modem_data.size <= 0 || modem_data.size >= 0x1000 || modem_data.data == NULL)
+ {
+ printf("ERROR: crespo_ipc_client_recv: we retrieve less bytes from the modem than we exepected!\n");
+ return 1;
+ }
- select(FD_SETSIZE, &fds, NULL, NULL, NULL);
+ resphdr = (struct ipc_header *) modem_data.data;
- if(FD_ISSET(modem_rfs_fd, &fds))
- {
- ioctl(modem_rfs_fd, IOCTL_MODEM_RECV, &modem_data);
- printf("ipc_recv: Modem RECV RFS (id=%d cmd=%d size=%d)!\n", modem_data.id, modem_data.cmd, modem_data.size);
- free(modem_data.data);
- wake_unlock("secril_fmt-interface", sizeof("secril_fmt-interface") - 1);
+ response->mseq = resphdr->mseq;
+ response->aseq = resphdr->aseq;
+ response->command = IPC_COMMAND(resphdr);
+ response->type = resphdr->type;
+ response->data_length = modem_data.size - sizeof(struct ipc_header);
- goto recv_loop_start;
- return 0;
- }
-#endif
+ if(response->data_length > 0)
+ {
+ response->data = malloc(response->data_length);
+ memcpy(response->data, (uint8_t *) modem_data.data + sizeof(struct ipc_header), response->data_length);
+ }
+ else
+ {
+ response->data = NULL;
+ }
- if(FD_ISSET(modem_fmt_fd, &fds))
- {
- ioctl(modem_fmt_fd, IOCTL_MODEM_RECV, &modem_data);
- printf("ipc_recv: Modem RECV FMT (id=%d cmd=%d size=%d)!\n", modem_data.id, modem_data.cmd, modem_data.size);
+ free(modem_data.data);
- if(modem_data.size <= 0 || modem_data.size >= 0x1000 || modem_data.data == NULL)
- {
- printf("ipc_recv: Something is wrong with the received message\n");
- return 1;
- }
+ wake_unlock("secril_fmt-interface", sizeof("secril_fmt-interface") - 1); // FIXME sizeof("...") is ugly!
- hdlc_data=(struct ipc_header *) modem_data.data;
-
- response->mseq=hdlc_data->mseq;
- response->aseq=hdlc_data->aseq;
- response->command=IPC_COMMAND(hdlc_data);
- response->type=hdlc_data->type;
- response->data_length=modem_data.size - sizeof(struct ipc_header);
-
- if(response->data_length > 0)
- {
- response->data=malloc(response->data_length);
- memcpy(response->data, (uint8_t *)modem_data.data + sizeof(struct ipc_header), response->data_length);
- }
- else
- {
- response->data=NULL;
- }
-
- free(modem_data.data);
-
- wake_unlock("secril_fmt-interface", sizeof("secril_fmt-interface") - 1);
- return 0;
- }
-
- return 1;
+ return 0;
}
struct ipc_ops crespo_ipc_ops = {
- .open = crespo_ipc_open,
- .bootstrap = crespo_ipc_bootstrap,
- .close = crespo_ipc_close,
- .power_on = crespo_ipc_power_on,
- .power_off = crespo_ipc_power_off,
- .send = crespo_ipc_send,
- .recv = crespo_ipc_recv,
- .fd_set = crespo_ipc_fd_set,
- .fd_get = crespo_ipc_fd_get,
+ .open = NULL,
+ .close = NULL,
+ .send = crespo_ipc_client_send,
+ .recv = crespo_ipc_client_recv,
+ .bootstrap = crespo_modem_bootstrap,
};
+