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; } }
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; } }
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)); }
void prepareFlash(int fd) { LOG(LOGLEVEL_INFO, "Preparing flash access...\n"); short param = 0; writePacket(fd, 0x84, ¶m, 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)); }
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); }
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; }