/* * Decode frames received on the B/D channel. * Note that this function will be called continously * with 64Kbit/s / 16Kbit/s of data and hence it will be * called 50 times per second with 20 ISOC descriptors. * Called at interrupt. */ static void usb_in_complete(struct urb *urb) { struct st5481_in *in = urb->context; unsigned char *ptr; struct sk_buff *skb; int len, count, status; if (urb->status < 0) { if (urb->status != -ENOENT) { WARN("urb status %d",urb->status); } else { DBG(1,"urb killed"); return; // Give up } } DBG_ISO_PACKET(0x80,urb); len = st5481_isoc_flatten(urb); ptr = urb->transfer_buffer; while (len > 0) { if (in->mode == L1_MODE_TRANS) { memcpy(in->rcvbuf, ptr, len); status = len; len = 0; } else { status = hdlc_decode(&in->hdlc_state, ptr, len, &count, in->rcvbuf, in->bufsize); ptr += count; len -= count; } if (status > 0) { // Good frame received DBG(4,"count=%d",status); DBG_PACKET(0x400, in->rcvbuf, status); if (!(skb = dev_alloc_skb(status))) { WARN("receive out of memory\n"); break; } memcpy(skb_put(skb, status), in->rcvbuf, status); in->hisax_if->l1l2(in->hisax_if, PH_DATA | INDICATION, skb); } else if (status == -HDLC_CRC_ERROR) { INFO("CRC error"); } else if (status == -HDLC_FRAMING_ERROR) { INFO("framing error"); } else if (status == -HDLC_LENGTH_ERROR) { INFO("length error"); } } // Prepare URB for next transfer urb->dev = in->adapter->usb_dev; urb->actual_length = 0; SUBMIT_URB(urb); }
int main(int argc, char *argv[]) { hdlc_enc hdlc_enc[10]; hdlc_dec hdlc_dec; if (argc == 1) { fputs("[error] no file \n", stderr); exit(1); } hdlc_init(hdlc_enc, &hdlc_dec); // hdlc encode, decode 구조체 초기화 hdlc_encode(argv[1], hdlc_enc); // file data encode hdlc_decode(hdlc_enc, &hdlc_dec);//hdlc_decode(hdlc_enc, hdlc_dec);// file data decode return 0; }
int log_data_decode_0x1069(int log_code, item_t *item) { int rc; log_item_header_t *header = (log_item_header_t*)item->buf; if (header->log_code != log_code) { return -1; } unsigned char *data = hdlc_decode(header, item); /* fill decode result */ unsigned char *res = (unsigned char*)DIAG_MALLOC(2048); if (res == NULL) { LOG_MSG("[E] malloc failed"); rc = 0; goto err_exit; } memset(res, 0, 2048); res_header_t *res_header = (res_header_t*)res; res_header->length = RES_HEADER_SIZE; res_header->id = DIAG_HTONS(RES_0X1069_ID); cdma_timestamp_decode(header->timestamp, &res_header->timestamp); res_header->timestamp.tv_sec = DIAG_HTONL(res_header->timestamp.tv_sec); res_header->timestamp.tv_usec = DIAG_HTONL(res_header->timestamp.tv_usec); res_0x1069_t *res_0x1069 = (res_0x1069_t*)(res_header+1); int txTotalPower = 0; power_t* power = (power_t*)data; LOG_MSG("[I] log_code: 0x%04x 0 TxTotalPower: %.2f dBm RxAGC0: %.2f dBm RxAGC1: %.2f dBm", header->log_code, power->txTotalPower/256.0f, power->rxAGC0/256.0f, power->rxAGC1/256.0f); res_0x1069->power[0].txTotalPower = DIAG_HTONS(power->txTotalPower); res_0x1069->power[0].rxAGC0 = DIAG_HTONS(power->rxAGC0); res_0x1069->power[0].rxAGC1 = DIAG_HTONS(power->rxAGC1); txTotalPower += power->txTotalPower; power ++; LOG_MSG("[I] log_code: 0x%04x 1 TxTotalPower: %.2f dBm RxAGC0: %.2f dBm RxAGC1: %.2f dBm", header->log_code, power->txTotalPower/256.0f, power->rxAGC0/256.0f, power->rxAGC1/256.0f); res_0x1069->power[1].txTotalPower = DIAG_HTONS(power->txTotalPower); res_0x1069->power[1].rxAGC0 = DIAG_HTONS(power->rxAGC0); res_0x1069->power[1].rxAGC1 = DIAG_HTONS(power->rxAGC1); //txTotalPower += power->txTotalPower; //txTotalPower /= 2; //LOG_MSG("[I] log_code: 0x%04x TxTotalPower: %d dBm", header->log_code, txTotalPower/256); //res_0x1069->txTotalPower = DIAG_HTONS(txTotalPower); res_header->length += RES_0X1069_SIZE; /* raw log data */ res_rawlog_t *rawlog = (res_rawlog_t*)(res_0x1069+1); rawlog->length = DIAG_HTONL(item->bufLen); res_header->length += RES_RAWLOG_SIZE; /* copy raw log adat */ memcpy(res+res_header->length, item->buf, item->bufLen); res_header->length += item->bufLen; /* end of decode */ item->res = res; item->resLen = res_header->length; rc = res_header->length; res_header->length = DIAG_HTONL(res_header->length); err_exit: if (item->escape) { DIAG_FREE(data); } /* LOG_MSG("[D] log_code: 0x%04x res dump", header->log_code); int x; for (x = 0; x < res_header->length; x++) { printf("%02x ", res[x]); if ((x+1)%16==0) printf("\n"); } printf("\n"); */ return rc; }