コード例 #1
0
ファイル: baseband.c プロジェクト: Alioune18/iphone-elite
size_t readBaseband(int fd, void *buffer, unsigned short size) {
    LOG(LOGLEVEL_STATUS, "Reading %u bytes from flash...\n", size);

    writePacket(fd, 0x803, &size, sizeof(size));
    void *temp = malloc(PACKET_SIZE(size));
    size_t length = readPacket(fd, DEFAULT_TIMEOUT, temp, PACKET_SIZE(size));

    void *ret = verifyPacket(temp, length);
    if (ret) {
        CmdPacket *packet = (CmdPacket *) temp;

        LOG(LOGLEVEL_DEBUG, "Read returns %d bytes:\n", packet->dataSize);
        LOGDO(LOGLEVEL_DEBUG, printBuffer(ret, packet->dataSize));

        if (packet->dataSize <= size) {
            memcpy(buffer, ret, packet->dataSize);
        } else {
            LOG(LOGLEVEL_WARN, "Warning: The returned data does not fit into the buffer!\n");
            memcpy(buffer, ret, size);
        }

        free(temp);
        return packet->dataSize;
    } else {
        LOG(LOGLEVEL_DEBUG, "Read returns: ERROR!\n");

        free(temp);
        return 0;
    }
}
コード例 #2
0
void computePijHom::fillPij(const tree& et, const stochasticProcess& sp, int derivationOrder, bool isReversible) {
	_V.resize(et.getNodesNum());
	treeIterTopDownConst tIt(et);
	tree::nodeP myNode = tIt.first();
	{// skipping the root, but allocating place for the root pij even if they are not use
	 // to maintain that all arrays have the same size.
		_V[myNode->id()].resize(sp.alphabetSize());
	}
	LOGDO(50,et.output(myLog::LogFile(),tree::ANCESTOR));
	LOGDO(50,et.output(myLog::LogFile(),tree::PHYLIP));
	for (; myNode != tIt.end(); myNode = tIt.next()) {
	  if (!(myNode->isRoot()))
		  _V[myNode->id()].fillPij(myNode->dis2father()*sp.getGlobalRate(),sp,derivationOrder,isReversible);
//	  else
//	    myLog::LogFile()<<"ROOT IS "<<myNode->name()<<endl;
	}
}
コード例 #3
0
ファイル: baseband.c プロジェクト: Alioune18/iphone-elite
void seekBaseband(int fd, unsigned int offset) {
    LOG(LOGLEVEL_INFO, "Seeking to 0x%08x...\n", offset);

    writePacket(fd, 0x802, &offset, sizeof(offset));
    char buffer[PACKET_SIZE(SEEK_REPLY_PACKET_SIZE)];
    size_t length = readPacket(fd, DEFAULT_TIMEOUT, buffer, sizeof(buffer));
    LOG(LOGLEVEL_DEBUG, "Seek returns:\n");
    LOGDO(LOGLEVEL_DEBUG, printBuffer(verifyPacket(buffer, length), SEEK_REPLY_PACKET_SIZE));
}
コード例 #4
0
ファイル: baseband.c プロジェクト: Alioune18/iphone-elite
void prepareFlash(int fd) {
    LOG(LOGLEVEL_INFO, "Preparing flash access...\n");

    short param = 0;
    writePacket(fd, 0x84, &param, sizeof(param));
    char buffer[PACKET_SIZE(CFI1_PACKET_SIZE)];
    size_t length = readPacket(fd, DEFAULT_TIMEOUT, buffer, sizeof(buffer));
    LOG(LOGLEVEL_DEBUG, "CFI Stage 1 returns:\n");
    LOGDO(LOGLEVEL_DEBUG, printBuffer(verifyPacket(buffer, length), CFI1_PACKET_SIZE));

    writePacket(fd, 0x85, NULL, 0);
    length = readPacket(fd, DEFAULT_TIMEOUT, buffer, sizeof(buffer));
    short *unknown = verifyPacket(buffer, length);
    LOG(LOGLEVEL_DEBUG, "CFI Stage 2 returns: %d\n", unknown ? *unknown : 0);
    //LOGDO(LOGLEVEL_DEBUG, printBuffer(buffer, length));
}
コード例 #5
0
ファイル: baseband.c プロジェクト: Alioune18/iphone-elite
static void writePacket(int fd, short cmd, void *data, size_t length) {
    char *buffer = malloc(PACKET_SIZE(length));
    //memset(buffer, 0, PACKET_SIZE(length));
    CmdPacket *packet = (CmdPacket *) buffer;
    packet->w02 = 2;
    packet->cmd = cmd;
    packet->dataSize = length;
    memcpy(buffer + CMD_PACKET_SIZE, data, length);
    CmdPacketEnd *end = (CmdPacketEnd *) (buffer + CMD_PACKET_SIZE + length);
    end->checksum = checksum(packet, data);
    end->w03 = 3;

    LOG(LOGLEVEL_TRACE, "Writing packet:\n");
    LOGDO(LOGLEVEL_TRACE, printBuffer(buffer, PACKET_SIZE(length)));

    write(fd, buffer, PACKET_SIZE(length));

    free(buffer);
}
コード例 #6
0
ファイル: baseband.c プロジェクト: Alioune18/iphone-elite
static size_t readPacket(int fd, int timeout, void *buffer, size_t length) {
    fd_set nfd;
    FD_ZERO(&nfd);
    FD_SET(fd, &nfd);
    struct timeval tv = {
        .tv_sec = timeout,
        .tv_usec = timeout ? 0 : 10000
    };

    size_t hlen = 0;
    //LOG(LOGLEVEL_INFO, "length=%lu hlen=%lu\n", length, hlen);
    while (length - hlen > 0 && select(fd + 1, &nfd, 0, 0, &tv) > 0) {
        hlen += read(fd, buffer + hlen, length - hlen);
        //LOG(LOGLEVEL_INFO, "hlen=%lu\n", hlen);
        //LOGDO(LOGLEVEL_DEBUG, printBuffer(buffer, hlen));
    }

    LOG(LOGLEVEL_TRACE, "Read packet:\n");
    LOGDO(LOGLEVEL_TRACE, printBuffer(buffer, hlen));

    return hlen;
}

int openBaseband(const char *device) {
    LOG(LOGLEVEL_INFO, "Opening %s...\n", device);

    int fd = open(device, O_NOCTTY | O_RDWR);
    ioctl(fd, TIOCNXCL);
    fcntl(fd, F_SETFL, 0);
    struct termios options;
    tcgetattr(fd, &options);
    int tcxonxoff = 0;
    ioctl(fd, 0x8004540A, &tcxonxoff);//_IOW('T', 10, int) = TCXONC?
    cfsetspeed(&options, DEFAULT_SPEED);
    cfmakeraw(&options);
    options.c_cc[VMIN] = 0;
    options.c_cc[VTIME] = 5;
    options.c_iflag = (options.c_iflag | (IGNBRK | IGNPAR)) & ~(ICRNL | IXON | IXOFF | IXANY | INPCK | ISTRIP | BRKINT);
    options.c_oflag = options.c_oflag & ~OPOST;
    options.c_cflag = (options.c_cflag | (CREAD | CS8 | CLOCAL | HUPCL | CRTSCTS)) & ~PARENB;
    options.c_lflag = options.c_lflag & ~(ECHO | ISIG | IEXTEN | ICANON);
    tcsetattr(fd, TCSANOW, &options);
    ioctl(fd, TIOCSDTR);
    ioctl(fd, TIOCCDTR);
    int lineBits = TIOCM_DTR | TIOCM_RTS | TIOCM_CTS | TIOCM_DSR;
    ioctl(fd, TIOCMSET, &lineBits);
    LOG(LOGLEVEL_DEBUG, "Baseband opened.\n");

    char buffer[128] = { '`', '\r' };
    LOG(LOGLEVEL_INFO, "Waiting for initialization...\n");
    size_t length;
    do {
        if (write(fd, buffer, 2) == -1) {
            LOG(LOGLEVEL_ERROR, "Can't write to baseband\n");
            close(fd);
            return -1;
        }
        length = readPacket(fd, 0, buffer, sizeof(buffer));
    } while (length == 0 || buffer[0] != 0xb);

    return fd;
}