Esempio n. 1
0
/*
 * 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);
}
Esempio n. 2
0
File: run.c Progetto: cupidljh/test
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;
}
Esempio n. 3
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;
}