Beispiel #1
0
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
	}
}
Beispiel #2
0
void capture_init(void)
{
	struct capture_drv * drv = &uart2_capture_drv;
	struct stm32_usart * uart = STM32_USART2;
	uint32_t clk;

	DCC_LOG2(LOG_TRACE, "drv=%p uart=%p...", drv, uart);

	clk = profclk_get();
	drv->rx_fifo.head = drv->rx_fifo.tail = 0;
	drv->rx_fifo.seq = 0;
	drv->rx_fifo.buf[0].clk = clk;
	drv->rx_fifo.buf[0].cnt = 0;
	drv->rx_fifo.buf[0].seq = 0;
	drv->rx_fifo.clk = clk;
#if SERIAL_STATS_ENABLE
	drv->err_cnt = 0;
	drv->ore_cnt = 0;
	drv->fe_cnt = 0;
#endif
	drv->idle_bits = 2;

	/* clock enable */
	stm32_clk_enable(STM32_RCC, STM32_CLK_USART2);

	/* UART --------------------------------------------------------------- */

	/* Disable UART */
	uart->cr1 = 0;
	/* Clear pending TC and BRK interrupts */
	uart->sr = 0;
	uart->gtpr = 1;
	capture_baudrate_set(SERIAL_BAUDRATE);
	/* configure the UART */
	uart->cr3 = USART_ONEBIT;
	/* Configure 8N1 */
	uart->cr2 = USART_STOP_1;
	/* enable UART, RX and IDLE interrupts */
	uart->cr1 = USART_UE | USART_RXNEIE;
	/* Errors interrupt */
	uart->cr3 |= USART_EIE;

	/* configure interrupts */
	cm3_irq_pri_set(STM32_IRQ_USART2, IRQ_PRIORITY_HIGHEST);
	/* enable interrupts */
	cm3_irq_enable(STM32_IRQ_USART2);
}
Beispiel #3
0
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;
}