void capture_idletime_set(unsigned int bits) { struct capture_drv * drv = &uart2_capture_drv; unsigned int rate; drv->idle_bits = bits; rate = drv->baudrate; if (bits == 0) drv->byte_time_max = BITS_TO_TICKS(21, rate * 2); else drv->byte_time_max = BITS_TO_TICKS(10 + drv->idle_bits, rate); DCC_LOG2(LOG_TRACE, "byte_time=%d max=%d...", profclk_us(drv->byte_time), profclk_us(drv->byte_time_max)); }
void stm32f_usart2_isr(void) { struct capture_drv * drv = &uart2_capture_drv; struct stm32_usart * uart = STM32_USART2; uint32_t sr; int c; sr = uart->sr; if (sr & USART_RXNE) { struct packet * pkt; uint32_t head; uint32_t clk; uint32_t diff; uint32_t cnt; int free; clk = profclk_get(); diff = clk - drv->rx_fifo.clk; drv->rx_fifo.clk = clk; c = uart->dr; DCC_LOG1(LOG_TRACE, "%d", profclk_us(diff)); head = drv->rx_fifo.head; pkt = &drv->rx_fifo.buf[head & (RX_FIFO_LEN - 1)]; cnt = pkt->cnt; if ((cnt == PACKET_DATA_MAX) || (diff > drv->byte_time_max)) { /* end of packet */ head++; free = RX_FIFO_LEN - (uint8_t)(head - drv->rx_fifo.tail); if (free != 0) { drv->rx_fifo.head = head; thinkos_sem_post_i(RX_SEM); pkt = &drv->rx_fifo.buf[head & (RX_FIFO_LEN - 1)]; } else { #if SERIAL_STATS_ENABLE drv->err_cnt++; #endif } pkt->seq = ++drv->rx_fifo.seq; pkt->clk = clk - drv->byte_time; cnt = 0; } pkt->data[cnt++] = c; pkt->cnt = cnt; } else if (sr & USART_ORE) { #if SERIAL_STATS_ENABLE drv->ore_cnt++; #endif } else if (sr & USART_FE) { #if SERIAL_STATS_ENABLE drv->fe_cnt++; #endif } }
void capture_baudrate_set(unsigned int rate) { struct capture_drv * drv = &uart2_capture_drv; struct stm32_usart * uart = STM32_USART2; unsigned int bits; uart->brr = stm32f_apb1_hz / rate; bits = drv->idle_bits; drv->baudrate = rate; drv->byte_time = BITS_TO_TICKS(10, rate); if (bits == 0) drv->byte_time_max = BITS_TO_TICKS(21, rate * 2); else drv->byte_time_max = BITS_TO_TICKS(10 + drv->idle_bits, rate); DCC_LOG2(LOG_TRACE, "byte_time=%d max=%d...", profclk_us(drv->byte_time), profclk_us(drv->byte_time_max)); }
int js(FILE * f, char * script, unsigned int len) { struct symtab * symtab = (struct symtab *)slcdev_symbuf; /* symbols */ uint8_t code[512]; /* compiled code */ uint32_t sdtbuf[64]; /* compiler buffer */ int32_t stack[16]; /* exec stack */ struct microjs_sdt * microjs; struct microjs_rt * rt; struct microjs_vm vm; struct symstat symstat; uint32_t start_clk; uint32_t stop_clk; int code_sz; int ret; profclk_init(); /* initialize compiler */ if ((microjs = microjs_sdt_init(sdtbuf, sizeof(sdtbuf), symtab, &slcdev_lib)) == NULL) { fprintf(f, "# internal error\n"); return -1; } symstat = symtab_state_save(symtab); microjs_sdt_begin(microjs, code, sizeof(code)); start_clk = profclk_get(); if ((ret = microjs_compile(microjs, script, len)) < 0) { symtab_state_rollback(symtab, symstat); fprintf(f, "# compile error: %d\n", -ret); DCC_LOG1(LOG_WARNING, "compile error: %d", ret); microjs_sdt_error(f, microjs, ret); DCC_LOG(LOG_TRACE, "..."); return -1; } if ((ret = microjs_sdt_end(microjs)) < 0) { symtab_state_rollback(symtab, symstat); fprintf(f, "# compile error: %d\n", -ret); DCC_LOG1(LOG_WARNING, "compile error: %d", ret); microjs_sdt_error(f, microjs, ret); DCC_LOG(LOG_TRACE, "..."); return -1; } stop_clk = profclk_get(); code_sz = ret; rt = symtab_rt_get(symtab); if (SLCDEV_VERBOSE()) { fprintf(f, " - Compile time: %d us.\n", profclk_us(stop_clk - start_clk)); fprintf(f, " - code: %d\n", code_sz); fprintf(f, " - data: %d of %d\n", rt->data_sz, sizeof(slcdev_vm_data)); fprintf(f, " - stack: %d of %d\n", rt->stack_sz, sizeof(stack)); } if (rt->data_sz > sizeof(slcdev_vm_data)) { fprintf(f, "# data overlow. %d bytes required\n", rt->data_sz); return -1; } if (rt->stack_sz > sizeof(stack)) { fprintf(f, "# stack overflow. %d bytes required\n", rt->stack_sz); return -1; } #if MICROJS_TRACE_ENABLED microjs_vm_tracef = f; #endif /* initialize virtual machine instance */ microjs_vm_init(&vm, rt, NULL, slcdev_vm_data, stack); start_clk = profclk_get(); if ((ret = microjs_exec(&vm, code)) != 0){ fprintf(f, "# exec error: %d\n", ret); return -1; } if (SLCDEV_VERBOSE()) { stop_clk = profclk_get(); fprintf(f, "Exec time: %d us.\n", profclk_us(stop_clk - start_clk)); } return 0; }