forked from ROMEO/obsw
uart1 IO
This commit is contained in:
@ -12,9 +12,10 @@
|
||||
#include "hardware/interfaces.h"
|
||||
#include <unistd.h>
|
||||
|
||||
struct lwip_sock *get_socket(int fd);
|
||||
|
||||
// Those three are a hack, but a quite performant one
|
||||
struct lwip_sock *get_socket(int fd); // only works with a patched lwip
|
||||
extern QueueHandle_t uart0_receive_queue;
|
||||
extern QueueHandle_t uart1_receive_queue;
|
||||
|
||||
void udp_echo_thread(void *_) {
|
||||
vTaskDelay(5000 * portTICK_RATE_MS);
|
||||
@ -51,8 +52,8 @@ void udp_echo_thread(void *_) {
|
||||
xil_printf("no addr");
|
||||
}
|
||||
|
||||
int uart_sock = hw_device_open("uart0", 5);
|
||||
write(uart_sock, "1234", 4);
|
||||
int uart0_fd = hw_device_open("uart0", 5);
|
||||
int uart1_fd = hw_device_open("uart1", 5);
|
||||
|
||||
// char buffer[] = {'1','2','3','4'};
|
||||
// ret = sendto(sock, buffer, sizeof(buffer), 0, (struct sockaddr *)
|
||||
@ -73,6 +74,7 @@ void udp_echo_thread(void *_) {
|
||||
|
||||
xQueueAddToSet(queue_id, listening_set);
|
||||
xQueueAddToSet(uart0_receive_queue, listening_set);
|
||||
xQueueAddToSet(uart1_receive_queue, listening_set);
|
||||
|
||||
while (1) {
|
||||
QueueSetMemberHandle_t readable =
|
||||
@ -80,8 +82,8 @@ void udp_echo_thread(void *_) {
|
||||
|
||||
if (readable == queue_id) {
|
||||
socklen_t peer_len = sizeof(peer_addr);
|
||||
ret = lwip_recvfrom(sock, rec_buffer, sizeof(rec_buffer), 0, (struct sockaddr *) &peer_addr,
|
||||
&peer_len);
|
||||
ret = lwip_recvfrom(sock, rec_buffer, sizeof(rec_buffer), 0,
|
||||
(struct sockaddr *)&peer_addr, &peer_len);
|
||||
if (peer_len > sizeof(peer_addr)) {
|
||||
xil_printf("invalid peer");
|
||||
continue;
|
||||
@ -93,14 +95,30 @@ void udp_echo_thread(void *_) {
|
||||
switch (port) {
|
||||
case 8100:
|
||||
xil_printf("udp rec 8100 len: %i\n", ret);
|
||||
write(uart_sock, rec_buffer, ret);
|
||||
write(uart0_fd, rec_buffer, ret);
|
||||
break;
|
||||
case 8101:
|
||||
xil_printf("udp rec 8101 len: %i\n", ret);
|
||||
write(uart1_fd, rec_buffer, ret);
|
||||
break;
|
||||
default:
|
||||
xil_printf("invalid port %i\n", port);
|
||||
break;
|
||||
}
|
||||
} else if (readable == uart1_receive_queue) {
|
||||
ret = read(uart1_fd, rec_buffer, sizeof(rec_buffer));
|
||||
// Do not send empty packets
|
||||
if (ret <= 0) {
|
||||
continue;
|
||||
}
|
||||
xil_printf("uart got %i\n", ret);
|
||||
peer_addr.sin_port = htons(8101);
|
||||
|
||||
// TODO sending 1 byte gives invalid UDP checksum
|
||||
lwip_sendto(sock, rec_buffer, ret, 0, (struct sockaddr *)&peer_addr,
|
||||
sizeof(peer_addr));
|
||||
} else if (readable == uart0_receive_queue) {
|
||||
ret = read(uart_sock, rec_buffer, sizeof(rec_buffer));
|
||||
ret = read(uart0_fd, rec_buffer, sizeof(rec_buffer));
|
||||
xil_printf("uart got %i\n", ret);
|
||||
|
||||
// Do not send empty packets
|
||||
@ -109,9 +127,9 @@ void udp_echo_thread(void *_) {
|
||||
}
|
||||
peer_addr.sin_port = htons(8100);
|
||||
|
||||
//TODO sending 1 byte gives invalid UDP checksum
|
||||
// TODO sending 1 byte gives invalid UDP checksum
|
||||
lwip_sendto(sock, rec_buffer, ret, 0, (struct sockaddr *)&peer_addr,
|
||||
sizeof(peer_addr));
|
||||
sizeof(peer_addr));
|
||||
} else {
|
||||
xil_printf("invalid handle");
|
||||
}
|
||||
|
Reference in New Issue
Block a user