Ejemplo n.º 1
0
int crespo_ipc_fmt_client_recv(struct ipc_client *client, struct ipc_message_info *response)
{
    struct modem_io modem_data;
    struct ipc_header *resphdr;
    int bread = 0;

    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_message_info));

    wake_lock("secril_fmt-interface", 20);

    assert(client->handlers->read != NULL);
    bread = client->handlers->read((uint8_t*) &modem_data, sizeof(struct modem_io) + MAX_MODEM_DATA_SIZE, client->handlers->read_data);
    if (bread < 0)
    {
        ipc_client_log(client, "crespo_ipc_fmt_client_recv: can't receive enough bytes from modem to process incoming response!");
        return -1;
    }

    if(modem_data.size <= 0 || modem_data.size >= MAX_MODEM_DATA_SIZE || modem_data.data == NULL)
    {
        ipc_client_log(client, "crespo_ipc_fmt_client_recv: we retrieve less (or fairly too much) bytes from the modem than we exepected!");
        return -1;
    }

    resphdr = (struct ipc_header *) modem_data.data;

    response->mseq = resphdr->mseq;
    response->aseq = resphdr->aseq;
    response->group = resphdr->group;
    response->index = resphdr->index;
    response->type = resphdr->type;
    response->length = modem_data.size - sizeof(struct ipc_header);
    response->data = NULL;

    ipc_client_log(client, "crespo_ipc_fmt_client_recv: RECV FMT (id=%d cmd=%d size=%d)!", modem_data.id, modem_data.cmd, modem_data.size);
    ipc_client_log(client, "crespo_ipc_fmt_client_recv: IPC response (aseq=0x%02x command=%s (0x%04x) type=%s)", 
                    response->aseq, ipc_command_to_str(IPC_COMMAND(response)), IPC_COMMAND(response), ipc_response_type_to_str(response->type));

    if(response->length > 0)
    {
#ifdef DEBUG
        ipc_client_log(client, "==== FMT DATA DUMP ====");
        ipc_hex_dump(client, (void *) (modem_data.data + sizeof(struct ipc_header)), response->length);
#endif
        response->data = malloc(response->length);
        memcpy(response->data, (uint8_t *) modem_data.data + sizeof(struct ipc_header), response->length);
    }

    free(modem_data.data);

    ipc_client_log(client, "");

    wake_unlock("secril_fmt-interface", 20);

    return 0;
}
Ejemplo n.º 2
0
int crespo_ipc_rfs_client_send(struct ipc_client *client, struct ipc_message_info *request)
{
    struct modem_io modem_data;
    int rc = 0;

    memset(&modem_data, 0, sizeof(struct modem_io));

    modem_data.id = request->mseq;
    modem_data.cmd = request->index;

    modem_data.size = request->length;
    modem_data.data = malloc(request->length);

    memcpy(modem_data.data, request->data, request->length);

    assert(client->handlers->write != NULL);

    ipc_client_log(client, "crespo_ipc_rfs_client_send: SEND RFS (id=%d cmd=%d size=%d)!", modem_data.id, modem_data.cmd, modem_data.size);
    ipc_client_log(client, "crespo_ipc_rfs_client_send: IPC request (mseq=0x%02x command=%s (0x%04x))", 
                    request->mseq, ipc_command_to_str(IPC_COMMAND(request)), IPC_COMMAND(request));

#ifdef DEBUG
    if(request->length > 0)
    {
        ipc_client_log(client, "==== RFS DATA DUMP ====");
        ipc_hex_dump(client, (void *) request->data, request->length);
    }
#endif

    ipc_client_log(client, "");

    rc = client->handlers->write((uint8_t*) &modem_data, sizeof(struct modem_io), client->handlers->write_data);
    return rc;
}
Ejemplo n.º 3
0
void ipc_parse_syssec(struct ipc_client* client, struct modem_io *ipc_frame)
{
	DEBUG_I("Entering");

	struct sysSecPacketHeader *rx_header;

    rx_header = (struct sysSecPacketHeader*)(ipc_frame->data);

	DEBUG_I("Syssec packet type = 0x%x\n  Syssec packet unk1 = 0x%X\n  packet length = 0x%X, unk2= 0x%X", rx_header->type, rx_header->unknown1, rx_header->bufLen, rx_header->unknown2);
	ipc_hex_dump(client, ipc_frame->data, rx_header->bufLen);
	DEBUG_I("Exiting");
}
Ejemplo n.º 4
0
void ipc_dispatch(struct ipc_client *client, struct modem_io *ipc_frame)
{
	switch(ipc_frame->cmd)
    {
		case FIFO_PKT_SIM:
			ipc_parse_sim(client, ipc_frame);
		break;
		case FIFO_PKT_PROTO:
			ipc_parse_proto(client, ipc_frame);
		break;
        case FIFO_PKT_TAPI:
        	ipc_parse_tapi(client, ipc_frame);
        break;
        case FIFO_PKT_FILE:
        	ipc_parse_fm(client, ipc_frame);
			/*
        	if (ret)
        	{
        		modem_send_tapi_init(ipc_frame);
        		sim_atk_open(0);
        		sim_open_to_modem(0);
        	}*/
        break;
		case FIFO_PKT_SOUND:
            ipc_parse_sound(client, ipc_frame);
		break;
        case FIFO_PKT_DVB_H_DebugLevel:
            ipc_parse_dbg_level(client, ipc_frame);
        break;
        case FIFO_PKT_BOOT:
            ipc_parse_boot(client, ipc_frame);
        break;
		case FIFO_PKT_SYSTEM:
			ipc_parse_system(client, ipc_frame);
		break;
        case FIFO_PKT_DRV:
        	ipc_parse_drv(client, ipc_frame);
        break;
        case FIFO_PKT_DEBUG:
        	ipc_parse_dbg(client, ipc_frame);
        break;
        default :
        	DEBUG_I("Packet type 0x%x not yet handled\n", ipc_frame->cmd);
        	DEBUG_I("Frame header = 0x%x\n Frame type = 0x%x\n Frame length = 0x%x\n", 
			ipc_frame->magic, ipc_frame->cmd, ipc_frame->datasize);
        	ipc_hex_dump(client, ipc_frame->data, ipc_frame->datasize);

    }
}
Ejemplo n.º 5
0
void ipc_parse_system(struct ipc_client *client, struct modem_io *ipc_frame)
{
	DEBUG_I("received SYSTEM packet with AMSS version, notifying RIL that AMSS has initialized");
	uint32_t desc_size;
	int suffix_size;
	desc_size = strlen((const char*)ipc_frame->data);
	if(desc_size > 32 || desc_size > ipc_frame->datasize)
		DEBUG_E("too big desc_size: %d", desc_size);
	else
		memcpy(cached_sw_version, ipc_frame->data, desc_size);
	cached_sw_version[desc_size] = 0x00;
	suffix_size = ipc_frame->datasize - desc_size - 1;
	if(suffix_size > 0) {
		DEBUG_I("dumping rest of data from IPC_SYSTEM packet");
		ipc_hex_dump(client, ipc_frame->data+desc_size+1, suffix_size);
	}
	ipc_invoke_ril_cb(CP_SYSTEM_START, ipc_frame->data);
}
Ejemplo n.º 6
0
int h1_ipc_send(struct ipc_client *client, struct ipc_message_info *request)
{
    struct hdlc_header *hdlc;
    unsigned char *frame;
    unsigned char *payload;
    int frame_length;

    /* Frame length: HDLC/IPC header + payload length + HDLC flags (2) */
    frame_length = (sizeof(*hdlc) + request->length + 2);

    frame = (unsigned char*)malloc(frame_length);
    frame[0] = FRAME_START;
    frame[frame_length-1] = FRAME_END;

    /* Setup HDLC header */
    hdlc = (struct hdlc_header*)(frame + 1);

    hdlc->length = (sizeof(*hdlc) + request->length);
    hdlc->unknown = 0;

    /* IPC header */
    hdlc->ipc.length = (sizeof(hdlc->ipc) + request->length);
    hdlc->ipc.mseq = request->mseq;
    hdlc->ipc.aseq = request->aseq;
    hdlc->ipc.group = request->group;
    hdlc->ipc.index = request->index;
    hdlc->ipc.type = request->type;

    /* IPC payload */
    payload = (frame + 1 + sizeof(*hdlc));
    memcpy(payload, request->data, request->length);

    ipc_client_log(client, "sending %s %s\n",
            ipc_command_to_str(IPC_COMMAND(request)),
            ipc_response_type_to_str(request->type));

    ipc_hex_dump(client, frame, frame_length);

    client->handlers->write(frame, frame_length,  client->handlers->write_data);

    free(frame);

    return 0;
}
Ejemplo n.º 7
0
int h1_ipc_recv(struct ipc_client *client, struct ipc_message_info *response)
{
    unsigned char buf[4];
    unsigned char *data;
    unsigned short *frame_length;
    struct ipc_header *ipc;
    int num_read;
    int left;

    num_read = client->handlers->read((void*)buf, sizeof(buf),  client->handlers->read_data);

    if(num_read == sizeof(buf) && *buf == FRAME_START) {
        frame_length = (unsigned short*)&buf[1];
        left = (*frame_length - 3 + 1);

        data = (unsigned char*)malloc(left);
        num_read = client->handlers->read((void*)data, left,  client->handlers->read_data);

        if(num_read == left && data[left-1] == FRAME_END) {
            ipc = (struct ipc_header*)data;
            response->mseq = ipc->mseq;
            response->aseq = ipc->aseq;
            response->group = ipc->group;
            response->index = ipc->index;
            response->type = ipc->type;
            response->length = (ipc->length - sizeof(*ipc));

            response->data = (unsigned char*)malloc(response->length);
            memcpy(response->data, (data + sizeof(*ipc)), response->length);

            ipc_client_log(client, "received %s %s\n",
                    ipc_command_to_str(IPC_COMMAND(response)),
                    ipc_response_type_to_str(response->type));

            ipc_hex_dump(client, data, num_read-1);

            return 0;
        }
    }

    return 0;
}
Ejemplo n.º 8
0
int crespo_ipc_fmt_client_send(struct ipc_client *client, struct ipc_message_info *request)
{
    struct modem_io modem_data;
    struct ipc_header reqhdr;
    int rc = 0;

    memset(&modem_data, 0, sizeof(struct modem_io));
    modem_data.size = request->length + sizeof(struct ipc_header);

    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));

    modem_data.data = malloc(reqhdr.length);

    memcpy(modem_data.data, &reqhdr, sizeof(struct ipc_header));
    memcpy((unsigned char *) (modem_data.data + sizeof(struct ipc_header)), request->data, request->length);

    assert(client->handlers->write != NULL);

    ipc_client_log(client, "crespo_ipc_fmt_client_send: SEND FMT (id=%d cmd=%d size=%d)!", modem_data.id, modem_data.cmd, modem_data.size);
    ipc_client_log(client, "crespo_ipc_fmt_client_send: IPC request (mseq=0x%02x command=%s (0x%04x) type=%s)", 
                    request->mseq, ipc_command_to_str(IPC_COMMAND(request)), IPC_COMMAND(request), ipc_request_type_to_str(request->type));

#ifdef DEBUG
    if(request->length > 0)
    {
        ipc_client_log(client, "==== FMT DATA DUMP ====");
        ipc_hex_dump(client, (void *) request->data, request->length);
    }
#endif

    ipc_client_log(client, "");

    rc = client->handlers->write((uint8_t*) &modem_data, sizeof(struct modem_io), client->handlers->write_data);
    return rc;
}