Пример #1
0
void test_loopback(void) {
    serial_t serial;
    unsigned int count;
    time_t start, stop;
    uint8_t lorem_ipsum[] = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
    uint8_t lorem_hugesum[4096*3];
    uint8_t buf[sizeof(lorem_hugesum)];

    ptest();

    passert(serial_open(&serial, device, 115200) == 0);

    /* Test write/flush/read */
    passert(serial_write(&serial, lorem_ipsum, sizeof(lorem_ipsum)) == sizeof(lorem_ipsum));
    passert(serial_flush(&serial) == 0);
    passert(serial_read(&serial, buf, sizeof(lorem_ipsum), -1) == sizeof(lorem_ipsum));
    passert(memcmp(lorem_ipsum, buf, sizeof(lorem_ipsum)) == 0);

    /* Test poll/write/flush/poll/input waiting/read */
    passert(serial_poll(&serial, 500) == 0); /* Should timeout */
    passert(serial_write(&serial, lorem_ipsum, sizeof(lorem_ipsum)) == sizeof(lorem_ipsum));
    passert(serial_flush(&serial) == 0);
    passert(serial_poll(&serial, 500) == 1);
    usleep(500000);
    passert(serial_input_waiting(&serial, &count) == 0);
    passert(count == sizeof(lorem_ipsum));
    passert(serial_read(&serial, buf, sizeof(lorem_ipsum), -1) == sizeof(lorem_ipsum));
    passert(memcmp(lorem_ipsum, buf, sizeof(lorem_ipsum)) == 0);

    /* Test non-blocking poll */
    passert(serial_poll(&serial, 0) == 0);

    /* Test a very large read-write (likely to exceed internal buffer size (~4096)) */
    memset(lorem_hugesum, 0xAA, sizeof(lorem_hugesum));
    passert(serial_write(&serial, lorem_hugesum, sizeof(lorem_hugesum)) == sizeof(lorem_hugesum));
    passert(serial_flush(&serial) == 0);
    passert(serial_read(&serial, buf, sizeof(lorem_hugesum), -1) == sizeof(lorem_hugesum));
    passert(memcmp(lorem_hugesum, buf, sizeof(lorem_hugesum)) == 0);

    /* Test read timeout */
    start = time(NULL);
    passert(serial_read(&serial, buf, sizeof(buf), 2000) == 0);
    stop = time(NULL);
    passert((stop - start) > 1);

    /* Test non-blocking read */
    start = time(NULL);
    passert(serial_read(&serial, buf, sizeof(buf), 0) == 0);
    stop = time(NULL);
    /* Assuming we weren't context switched out for a second and weren't on a
     * thin time boundary ;) */
    passert((stop - start) == 0);

    passert(serial_close(&serial) == 0);
}
Пример #2
0
void some_serial_stuff()
{
	disable_int();

	printk("COM1: setting up\n");

	outb(PORT + 1, 0x00);
	outb(PORT + 3, 0x80);
	outb(PORT + 0, 0x03);
	outb(PORT + 1, 0x00);
	outb(PORT + 3, 0x03);
	outb(PORT + 2, 0xc7);
	//outb(PORT + 2, 0x07); // debugging: trigger every byte
	outb(PORT + 4, 0x0b);

	set_int(0x24, &a_irq4_handler);
	irq_mask(4, 0);

	enable_int();

	serial_started = 1;

	printk("COM1: should be upset now\n");

	serial_poll();
}
Пример #3
0
void serial_printk(char* s)
{
	for (; *s != 0; s++) {
		send_queue[send_end] = *s;
		send_end = (send_end + 1) % QUEUE_LENGTH;
	}

	serial_poll();
}
Пример #4
0
Файл: sim.c Проект: wpwrak/idbg
static void tx(void)
{
	SBUF0 = 0;
	serial_poll();
	if (SBUF0)
		fprintf(stderr, "tx %c\n", SBUF0);
	else
		fprintf(stderr, "----\n");
}
Пример #5
0
Файл: sim.c Проект: wpwrak/idbg
int main(void)
{
	serial_init();
	serial_poll();

	/*
	 * The simulator only has one endpoint, so we do the TX test first.
	 */

	/* TX test */
	usb_arrive("TEST");
	usb_arrive("MORE");
	txn(4);
	txn(5);
	usb_arrive("XXXX");
	usb_arrive("YYYY");
	txn(10);

	/* RX test */

	rx('A');
	serial_poll();
	rx('B');
	rx('C');
	rx('D');
	rx('E');
	rx('F');
	rx('G');
	serial_poll();
	serial_poll();
	callback();
	serial_poll();
	serial_poll();
	callback();
	rx('H');
	serial_poll();
	serial_poll();
	callback();
	serial_poll();
	serial_poll();

	return 0;
}
Пример #6
0
/*function:实现数据的接收和数据的初步解析
input: recv_packet接收数据放在这个包里 recv_total_len可以接收的最大字节数 timeout 超时
output: 当前串口数据状态,SERIAL_STATUS_OK 成功接收一帧数据
*/
static int recv_pack(char *recv_packet, int recv_total_len, int *recv_len,int timeout)
{
	// int recv_len=0;//recv_packet中接收的总字节数
	 int pack_len=0;//接收包的总长度
	 *recv_len = 0;
    while(1)
    {
        int ret,i;
        int read_len;
        
        ret = serial_poll(serial_id,timeout);
        if (ret < 0)
           return SERIAL_STATUS_PORT_ERR;
        if (ret == 0)
            return SERIAL_STATUS_TIMEOUT;
        
        read_len = serial_read(serial_id, recv_packet + *recv_len, recv_total_len-(*recv_len));
        if (read_len <= 0)//未收到数据
            return SERIAL_STATUS_PORT_ERR;

        *recv_len += read_len;//数据长度

       // return SERIAL_STATUS_OK;

        /*数据初步解析*/
        if(recv_packet[0] != 0xa5 || recv_packet[1] != 0xa5)//包头不对,放弃该数据
        {
			//serial_flush(serial_id, SERIAL_FLUSH_RX);//清空接收缓存
			return SERIAL_STATUS_PACK_ERR;
        }
        pack_len = recv_packet[2]*256 + recv_packet[3];//读取指令长度
        pack_len = pack_len+6;//根据协议,添加上头尾的长度
        
        if(pack_len <= *recv_len)//一帧数据接收完毕
        {
			if((recv_packet[pack_len-1] != 0x5a) || (recv_packet[pack_len-2] != 0x5a) || !check_sum(recv_packet , pack_len))//包尾校验,校验和
			{
				//serial_flush(serial_id, SERIAL_FLUSH_RX);//清空接收缓存
				return SERIAL_STATUS_PACK_ERR;				
			}
			//serial_flush(serial_id, SERIAL_FLUSH_RX);//清空接收缓存
			return SERIAL_STATUS_OK;
        }
        if(pack_len < *recv_len)
        {
			//	serial_flush(serial_id, SERIAL_FLUSH_RX);//清空接收缓存
			//	return SERIAL_STATUS_PACK_ERR;				
        }
    }	
}
Пример #7
0
static int lua_serial_poll(lua_State *L) {
    serial_t *serial;
    int timeout_ms;
    int ret;

    serial = luaL_checkudata(L, 1, "periphery.Serial");

    lua_serial_checktype(L, 2, LUA_TNUMBER);

    timeout_ms = lua_tounsigned(L, 2);

    if ((ret = serial_poll(serial, timeout_ms)) < 0)
        return lua_serial_error(L, ret, serial_errno(serial), "Error: %s", serial_errmsg(serial));

    lua_pushboolean(L, ret);

    return 1;
}
Пример #8
0
/*实现发送和接收*/
static int echodemo_transaction(char *send_packet, int send_len, char *recv_packet, int recv_total_len, int *recv_len, 
                             int serial_id,int timeout)
{
    if (serial_id == -1)
        return SERIAL_STATUS_PORT_ERR;
    
    if (!serial_flush(serial_id, SERIAL_FLUSH_RX|SERIAL_FLUSH_TX))
        return SERIAL_STATUS_PORT_ERR;

    if (serial_write(serial_id, send_packet, send_len) != send_len)
        return SERIAL_STATUS_PORT_ERR;

    //read packet
    *recv_len = 0;
    while(1)
    {
        int ret,i;
        int read_len;
        
        ret = serial_poll(serial_id,timeout);
        if (ret < 0)
           return SERIAL_STATUS_PORT_ERR;
        if (ret == 0)
            return SERIAL_STATUS_TIMEOUT;
        
        if (recv_total_len <= *recv_len)
            return SERIAL_STATUS_PKT_ERR;
        
        read_len = serial_read(serial_id, recv_packet+(*recv_len), recv_total_len-(*recv_len));
        if (read_len <= 0)
            return SERIAL_STATUS_PORT_ERR;

        *recv_len += read_len;
        for(i = 0; i < *recv_len; i++)
        {
            if (recv_packet[i] == '\n')
            {
                return SERIAL_STATUS_OK;
            }
        }
    }
    return SERIAL_STATUS_PORT_ERR;
}
Пример #9
0
int
kernel_main (void) {

	//attach stdin and stdout
	serial_startup();

	printf("*****************************************\n");
	printf("kernel_main()\n");

	//any setup functions that need to be called?
	timer_setup();

	/* The main processing loop */
	while (1) {
		serial_poll();
		clock_update();
		time_update();
		
		if (task_spin() < 0) {
			//print_func("task error. Restarting\n");
		}
	}
}
Пример #10
0
void irq4_handler()
{
	printk("COM1 IRQ\n");
	serial_poll();
}
Пример #11
0
static int handle_input(void)
{
    static struct timeval pressed;
    static int long_press;
    struct timeval now, diff;
    unsigned long key;
    int rc;

    serial_poll();

    if (pressed.tv_sec && pressed.tv_usec) {
	gettimeofday(&now, NULL);
	timesub(&diff, &now, &pressed);
	/* LONG_PRESS? */
	if (diff.tv_sec >= 1) {
	    switch (visual) {
	    case VIEW_SATS:  visual = VIEW_MAP; break;
	    case VIEW_MAP:   visual = VIEW_ROUTE; break;
	    case VIEW_ROUTE: visual = VIEW_SATS; break;
	    }
	    /* allow for cycling by keeping the button pressed */
	    pressed.tv_sec  = now.tv_sec;
	    pressed.tv_usec = now.tv_usec;
	    long_press = 1;
	    do_refresh = 1;
	    return 0;
	}
    }

    rc = empeg_getkey(&key);
    if (rc != 1) return rc;

    switch(key) {
    case IR_TOP_BUTTON_PRESSED:
	if (!load_route && !menu)
	    return 1; /* done, wait to be selected again in the hijack menu */

	load_route = 0;
	menu = 0;
	do_refresh = 1;
	break;

    case IR_BOTTOM_BUTTON_PRESSED:
	gettimeofday(&pressed, NULL);
	break;

    case IR_BOTTOM_BUTTON_RELEASED:
	pressed.tv_sec = pressed.tv_usec = 0;
	if (long_press) {
	    long_press = 0;
	    break;
	}
	if (load_route) {
	    route_load();
	    load_route = 0;
	    menu = 0;
	}
	else if (menu) {
	    switch(menu_pos) {
	    case 0: load_route = routes_init(); break;
	    case 1:
		switch (visual) {
		case VIEW_SATS:  visual = VIEW_MAP; break;
		case VIEW_MAP:   visual = VIEW_ROUTE; break;
		case VIEW_ROUTE: visual = VIEW_SATS; break;
		}
		break;
	    case 2:
		if (++show_popups == 3)
		    show_popups = 0;
		break;
	    case 3: show_metric = 1 - show_metric; break;
	    case 4: show_gpscoords = 1 - show_gpscoords;  break;
	    case 5: show_time = 1 - show_time; break;
	    case 6: show_track = 1 - show_track; break;
	    case 7:
		if (++coord_format == 3)
		    coord_format = 0;
		break;
	    }
	    menu = 0; lastmenu = 3; lastmenu_pos = menu_pos;
	}
	else
	    menu = 1;

	do_refresh = 1;
	break;

    case IR_LEFT_BUTTON_PRESSED:
	if (load_route)
	    route_select(0);
	else if (menu) {
	    if (--menu_pos < 0)
		menu_pos = MENU_ENTRIES - 1;
	}
	else {
	    switch (visual) {
	    case VIEW_SATS:  break;
	    case VIEW_MAP:   draw_zoom(0); break;
	    case VIEW_ROUTE: route_skipwp(-1); break;
	    }
	}
	do_refresh = 1;
	break;

    case IR_RIGHT_BUTTON_PRESSED:
	if (load_route)
	    route_select(1);
	else if (menu) {
	    if (++menu_pos >= MENU_ENTRIES)
		menu_pos = 0;
	}
	else {
	    switch (visual) {
	    case VIEW_SATS:  break;
	    case VIEW_MAP:   draw_zoom(1); break;
	    case VIEW_ROUTE: route_skipwp(1); break;
	    }
	}
	do_refresh = 1;
	break;

    case IR_KNOB_LEFT:
    case IR_KNOB_RIGHT:
	route_skipwp(key == IR_KNOB_LEFT ? -1 : 1);
	route_locate();
	do_refresh = 1;
	break;

    case IR_KNOB_PRESSED:
    default:
	break;
    }

    return 0;
}