forked from Imagelibrary/rtems
termios: Separate flow control from normal handler
This commit is contained in:
@@ -103,6 +103,7 @@ rtems_device_driver console_initialize(
|
|||||||
major,
|
major,
|
||||||
minor,
|
minor,
|
||||||
handler,
|
handler,
|
||||||
|
NULL,
|
||||||
(void *) ctx
|
(void *) ctx
|
||||||
);
|
);
|
||||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||||
@@ -536,8 +537,6 @@ const rtems_termios_device_handler tms570_sci_handler_polled = {
|
|||||||
.poll_read = tms570_sci_poll_read,
|
.poll_read = tms570_sci_poll_read,
|
||||||
.write = tms570_sci_poll_write,
|
.write = tms570_sci_poll_write,
|
||||||
.set_attributes = tms570_sci_set_attributes,
|
.set_attributes = tms570_sci_set_attributes,
|
||||||
.stop_remote_tx = NULL,
|
|
||||||
.start_remote_tx = NULL,
|
|
||||||
.mode = TERMIOS_POLLED
|
.mode = TERMIOS_POLLED
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -553,7 +552,5 @@ const rtems_termios_device_handler tms570_sci_handler_interrupt = {
|
|||||||
.poll_read = NULL,
|
.poll_read = NULL,
|
||||||
.write = tms570_sci_interrupt_write,
|
.write = tms570_sci_interrupt_write,
|
||||||
.set_attributes = tms570_sci_set_attributes,
|
.set_attributes = tms570_sci_set_attributes,
|
||||||
.stop_remote_tx = NULL,
|
|
||||||
.start_remote_tx = NULL,
|
|
||||||
.mode = TERMIOS_IRQ_DRIVEN
|
.mode = TERMIOS_IRQ_DRIVEN
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ rtems_device_driver console_initialize(
|
|||||||
major,
|
major,
|
||||||
minor,
|
minor,
|
||||||
handler,
|
handler,
|
||||||
|
NULL,
|
||||||
leon3_console_get_uart(syscon_uart_index)
|
leon3_console_get_uart(syscon_uart_index)
|
||||||
);
|
);
|
||||||
if (status != RTEMS_SUCCESSFUL)
|
if (status != RTEMS_SUCCESSFUL)
|
||||||
@@ -147,6 +148,7 @@ rtems_device_driver console_initialize(
|
|||||||
major,
|
major,
|
||||||
minor,
|
minor,
|
||||||
handler,
|
handler,
|
||||||
|
NULL,
|
||||||
leon3_console_get_uart(syscon_uart_index)
|
leon3_console_get_uart(syscon_uart_index)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,6 +143,18 @@ typedef struct {
|
|||||||
const struct termios *term
|
const struct termios *term
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Termios device mode.
|
||||||
|
*/
|
||||||
|
rtems_termios_device_mode mode;
|
||||||
|
} rtems_termios_device_handler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Termios device flow control handler.
|
||||||
|
*
|
||||||
|
* @see rtems_termios_device_install().
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
/**
|
/**
|
||||||
* @brief Indicate to stop remote transmitter.
|
* @brief Indicate to stop remote transmitter.
|
||||||
*
|
*
|
||||||
@@ -160,12 +172,7 @@ typedef struct {
|
|||||||
* @see rtems_termios_get_device_context().
|
* @see rtems_termios_get_device_context().
|
||||||
*/
|
*/
|
||||||
void (*start_remote_tx)(struct rtems_termios_tty *tty);
|
void (*start_remote_tx)(struct rtems_termios_tty *tty);
|
||||||
|
} rtems_termios_device_flow;
|
||||||
/**
|
|
||||||
* @brief Termios device mode.
|
|
||||||
*/
|
|
||||||
rtems_termios_device_mode mode;
|
|
||||||
} rtems_termios_device_handler;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Termios device node for installed devices.
|
* @brief Termios device node for installed devices.
|
||||||
@@ -177,6 +184,7 @@ typedef struct rtems_termios_device_node {
|
|||||||
rtems_device_major_number major;
|
rtems_device_major_number major;
|
||||||
rtems_device_minor_number minor;
|
rtems_device_minor_number minor;
|
||||||
const rtems_termios_device_handler *handler;
|
const rtems_termios_device_handler *handler;
|
||||||
|
const rtems_termios_device_flow *flow;
|
||||||
void *context;
|
void *context;
|
||||||
struct rtems_termios_tty *tty;
|
struct rtems_termios_tty *tty;
|
||||||
} rtems_termios_device_node;
|
} rtems_termios_device_node;
|
||||||
@@ -254,6 +262,11 @@ typedef struct rtems_termios_tty {
|
|||||||
*/
|
*/
|
||||||
rtems_termios_device_handler handler;
|
rtems_termios_device_handler handler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The device flow control handler.
|
||||||
|
*/
|
||||||
|
rtems_termios_device_flow flow;
|
||||||
|
|
||||||
volatile unsigned int flow_ctrl;
|
volatile unsigned int flow_ctrl;
|
||||||
unsigned int lowwater,highwater;
|
unsigned int lowwater,highwater;
|
||||||
|
|
||||||
@@ -295,11 +308,14 @@ typedef struct rtems_termios_tty {
|
|||||||
* @brief Installs a Termios device.
|
* @brief Installs a Termios device.
|
||||||
*
|
*
|
||||||
* @param[in] device_file If not @c NULL, then a device file for the specified
|
* @param[in] device_file If not @c NULL, then a device file for the specified
|
||||||
* major and minor number will be created.
|
* major and minor number will be created.
|
||||||
* @param[in] major The device major number of the corresponding device driver.
|
* @param[in] major The device major number of the corresponding device driver.
|
||||||
* @param[in] minor The device minor number of the corresponding device driver.
|
* @param[in] minor The device minor number of the corresponding device driver.
|
||||||
* @param[in] handler The device handler. It must be persistent throughout the
|
* @param[in] handler The device handler. It must be persistent throughout the
|
||||||
* installed time of the device.
|
* installed time of the device.
|
||||||
|
* @param[in] flow The device flow control handler. The device flow control
|
||||||
|
* handler are optional and may be @c NULL. If present must be persistent
|
||||||
|
* throughout the installed time of the device.
|
||||||
* @param[in] context The device context. It must be persistent throughout the
|
* @param[in] context The device context. It must be persistent throughout the
|
||||||
* installed time of the device.
|
* installed time of the device.
|
||||||
*
|
*
|
||||||
@@ -307,17 +323,18 @@ typedef struct rtems_termios_tty {
|
|||||||
* @retval RTEMS_NO_MEMORY Not enough memory to create a device node.
|
* @retval RTEMS_NO_MEMORY Not enough memory to create a device node.
|
||||||
* @retval RTEMS_UNSATISFIED Creation of the device file failed.
|
* @retval RTEMS_UNSATISFIED Creation of the device file failed.
|
||||||
* @retval RTEMS_RESOURCE_IN_USE There exists a device node for this major and
|
* @retval RTEMS_RESOURCE_IN_USE There exists a device node for this major and
|
||||||
* minor number pair.
|
* minor number pair.
|
||||||
* @retval RTEMS_INCORRECT_STATE Termios is not initialized.
|
* @retval RTEMS_INCORRECT_STATE Termios is not initialized.
|
||||||
*
|
*
|
||||||
* @see rtems_termios_device_remove(), rtems_termios_device_open(),
|
* @see rtems_termios_device_remove(), rtems_termios_device_open(),
|
||||||
* rtems_termios_device_close() and rtems_termios_get_device_context().
|
* rtems_termios_device_close() and rtems_termios_get_device_context().
|
||||||
*/
|
*/
|
||||||
rtems_status_code rtems_termios_device_install(
|
rtems_status_code rtems_termios_device_install(
|
||||||
const char *device_file,
|
const char *device_file,
|
||||||
rtems_device_major_number major,
|
rtems_device_major_number major,
|
||||||
rtems_device_minor_number minor,
|
rtems_device_minor_number minor,
|
||||||
const rtems_termios_device_handler *handler,
|
const rtems_termios_device_handler *handler,
|
||||||
|
const rtems_termios_device_flow *flow,
|
||||||
void *context
|
void *context
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -133,6 +133,7 @@ rtems_status_code rtems_termios_device_install(
|
|||||||
rtems_device_major_number major,
|
rtems_device_major_number major,
|
||||||
rtems_device_minor_number minor,
|
rtems_device_minor_number minor,
|
||||||
const rtems_termios_device_handler *handler,
|
const rtems_termios_device_handler *handler,
|
||||||
|
const rtems_termios_device_flow *flow,
|
||||||
void *context
|
void *context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@@ -148,6 +149,7 @@ rtems_status_code rtems_termios_device_install(
|
|||||||
new_device_node->major = major;
|
new_device_node->major = major;
|
||||||
new_device_node->minor = minor;
|
new_device_node->minor = minor;
|
||||||
new_device_node->handler = handler;
|
new_device_node->handler = handler;
|
||||||
|
new_device_node->flow = flow;
|
||||||
new_device_node->context = context;
|
new_device_node->context = context;
|
||||||
new_device_node->tty = NULL;
|
new_device_node->tty = NULL;
|
||||||
|
|
||||||
@@ -458,6 +460,11 @@ rtems_termios_open_tty(
|
|||||||
if (device_node != NULL) {
|
if (device_node != NULL) {
|
||||||
device_node->tty = tty;
|
device_node->tty = tty;
|
||||||
tty->handler = *device_node->handler;
|
tty->handler = *device_node->handler;
|
||||||
|
|
||||||
|
if (device_node->flow != NULL) {
|
||||||
|
tty->flow = *device_node->flow;
|
||||||
|
}
|
||||||
|
|
||||||
tty->device_node = device_node;
|
tty->device_node = device_node;
|
||||||
tty->device_context = device_node->context;
|
tty->device_context = device_node->context;
|
||||||
memset(&tty->device, 0, sizeof(tty->device));
|
memset(&tty->device, 0, sizeof(tty->device));
|
||||||
@@ -472,9 +479,9 @@ rtems_termios_open_tty(
|
|||||||
rtems_termios_callback_write : NULL;
|
rtems_termios_callback_write : NULL;
|
||||||
tty->handler.set_attributes = callbacks->setAttributes != NULL ?
|
tty->handler.set_attributes = callbacks->setAttributes != NULL ?
|
||||||
rtems_termios_callback_setAttributes : NULL;
|
rtems_termios_callback_setAttributes : NULL;
|
||||||
tty->handler.stop_remote_tx = callbacks->stopRemoteTx != NULL ?
|
tty->flow.stop_remote_tx = callbacks->stopRemoteTx != NULL ?
|
||||||
rtems_termios_callback_stopRemoteTx : NULL;
|
rtems_termios_callback_stopRemoteTx : NULL;
|
||||||
tty->handler.start_remote_tx = callbacks->startRemoteTx != NULL ?
|
tty->flow.start_remote_tx = callbacks->startRemoteTx != NULL ?
|
||||||
rtems_termios_callback_startRemoteTx : NULL;
|
rtems_termios_callback_startRemoteTx : NULL;
|
||||||
tty->handler.mode = callbacks->outputUsesInterrupts;
|
tty->handler.mode = callbacks->outputUsesInterrupts;
|
||||||
tty->device_context = NULL;
|
tty->device_context = NULL;
|
||||||
@@ -818,8 +825,8 @@ termios_set_flowctrl(struct rtems_termios_tty *tty)
|
|||||||
|
|
||||||
/* restart remote Tx, if it was stopped */
|
/* restart remote Tx, if it was stopped */
|
||||||
if ((tty->flow_ctrl & FL_IRTSOFF) &&
|
if ((tty->flow_ctrl & FL_IRTSOFF) &&
|
||||||
(tty->handler.start_remote_tx != NULL)) {
|
(tty->flow.start_remote_tx != NULL)) {
|
||||||
tty->handler.start_remote_tx(tty);
|
tty->flow.start_remote_tx(tty);
|
||||||
}
|
}
|
||||||
tty->flow_ctrl &= ~(FL_IRTSOFF);
|
tty->flow_ctrl &= ~(FL_IRTSOFF);
|
||||||
}
|
}
|
||||||
@@ -1444,8 +1451,8 @@ fillBufferQueue (struct rtems_termios_tty *tty)
|
|||||||
} else if (tty->flow_ctrl & FL_MDRTS) {
|
} else if (tty->flow_ctrl & FL_MDRTS) {
|
||||||
tty->flow_ctrl &= ~FL_IRTSOFF;
|
tty->flow_ctrl &= ~FL_IRTSOFF;
|
||||||
/* activate RTS line */
|
/* activate RTS line */
|
||||||
if (tty->handler.start_remote_tx != NULL) {
|
if (tty->flow.start_remote_tx != NULL) {
|
||||||
tty->handler.start_remote_tx(tty);
|
tty->flow.start_remote_tx(tty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1624,8 +1631,8 @@ rtems_termios_enqueue_raw_characters (void *ttyp, const char *buf, int len)
|
|||||||
} else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) {
|
} else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) {
|
||||||
tty->flow_ctrl |= FL_IRTSOFF;
|
tty->flow_ctrl |= FL_IRTSOFF;
|
||||||
/* deactivate RTS line */
|
/* deactivate RTS line */
|
||||||
if (tty->handler.stop_remote_tx != NULL) {
|
if (tty->flow.stop_remote_tx != NULL) {
|
||||||
tty->handler.stop_remote_tx(tty);
|
tty->flow.stop_remote_tx(tty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -489,6 +489,7 @@ rtems_device_driver console_initialize(
|
|||||||
major,
|
major,
|
||||||
minor,
|
minor,
|
||||||
handler,
|
handler,
|
||||||
|
NULL,
|
||||||
ctx
|
ctx
|
||||||
);
|
);
|
||||||
if (sc != RTEMS_SUCCESSFUL) @{
|
if (sc != RTEMS_SUCCESSFUL) @{
|
||||||
|
|||||||
@@ -560,17 +560,31 @@ static void test_device_install_remove(void)
|
|||||||
|
|
||||||
greedy = rtems_heap_greedy_allocate( NULL, 0 );
|
greedy = rtems_heap_greedy_allocate( NULL, 0 );
|
||||||
|
|
||||||
sc = rtems_termios_device_install( "/", major, minor, &handler, NULL );
|
sc = rtems_termios_device_install( "/", major, minor, &handler, NULL, NULL );
|
||||||
rtems_test_assert( sc == RTEMS_NO_MEMORY );
|
rtems_test_assert( sc == RTEMS_NO_MEMORY );
|
||||||
|
|
||||||
rtems_heap_greedy_free( greedy );
|
rtems_heap_greedy_free( greedy );
|
||||||
|
|
||||||
rtems_test_assert( rtems_resource_snapshot_check( &snapshot ) );
|
rtems_test_assert( rtems_resource_snapshot_check( &snapshot ) );
|
||||||
|
|
||||||
sc = rtems_termios_device_install( NULL, major, minor, &handler, NULL );
|
sc = rtems_termios_device_install(
|
||||||
|
NULL,
|
||||||
|
major,
|
||||||
|
minor,
|
||||||
|
&handler,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
rtems_test_assert( sc == RTEMS_SUCCESSFUL );
|
rtems_test_assert( sc == RTEMS_SUCCESSFUL );
|
||||||
|
|
||||||
sc = rtems_termios_device_install( NULL, major, minor, &handler, NULL );
|
sc = rtems_termios_device_install(
|
||||||
|
NULL,
|
||||||
|
major,
|
||||||
|
minor,
|
||||||
|
&handler,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
rtems_test_assert( sc == RTEMS_RESOURCE_IN_USE );
|
rtems_test_assert( sc == RTEMS_RESOURCE_IN_USE );
|
||||||
|
|
||||||
sc = rtems_termios_device_remove( NULL, major, minor );
|
sc = rtems_termios_device_remove( NULL, major, minor );
|
||||||
@@ -578,7 +592,7 @@ static void test_device_install_remove(void)
|
|||||||
|
|
||||||
rtems_test_assert( rtems_resource_snapshot_check( &snapshot ) );
|
rtems_test_assert( rtems_resource_snapshot_check( &snapshot ) );
|
||||||
|
|
||||||
sc = rtems_termios_device_install( "/", major, minor, &handler, NULL );
|
sc = rtems_termios_device_install( "/", major, minor, &handler, NULL, NULL );
|
||||||
rtems_test_assert( sc == RTEMS_UNSATISFIED );
|
rtems_test_assert( sc == RTEMS_UNSATISFIED );
|
||||||
|
|
||||||
rtems_test_assert( rtems_resource_snapshot_check( &snapshot ) );
|
rtems_test_assert( rtems_resource_snapshot_check( &snapshot ) );
|
||||||
@@ -586,7 +600,14 @@ static void test_device_install_remove(void)
|
|||||||
sc = rtems_termios_device_remove( NULL, major, minor );
|
sc = rtems_termios_device_remove( NULL, major, minor );
|
||||||
rtems_test_assert( sc == RTEMS_INVALID_ID );
|
rtems_test_assert( sc == RTEMS_INVALID_ID );
|
||||||
|
|
||||||
sc = rtems_termios_device_install( &dev[0], major, minor, &handler, NULL );
|
sc = rtems_termios_device_install(
|
||||||
|
&dev[0],
|
||||||
|
major,
|
||||||
|
minor,
|
||||||
|
&handler,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
rtems_test_assert( sc == RTEMS_SUCCESSFUL );
|
rtems_test_assert( sc == RTEMS_SUCCESSFUL );
|
||||||
|
|
||||||
sc = rtems_termios_device_remove( "/barfoo", major, minor );
|
sc = rtems_termios_device_remove( "/barfoo", major, minor );
|
||||||
@@ -638,7 +659,14 @@ static void test_first_open_error(void)
|
|||||||
|
|
||||||
rtems_resource_snapshot_take( &snapshot );
|
rtems_resource_snapshot_take( &snapshot );
|
||||||
|
|
||||||
sc = rtems_termios_device_install( &dev[0], major, minor, &handler, &done );
|
sc = rtems_termios_device_install(
|
||||||
|
&dev[0],
|
||||||
|
major,
|
||||||
|
minor,
|
||||||
|
&handler,
|
||||||
|
NULL,
|
||||||
|
&done
|
||||||
|
);
|
||||||
rtems_test_assert( sc == RTEMS_SUCCESSFUL );
|
rtems_test_assert( sc == RTEMS_SUCCESSFUL );
|
||||||
|
|
||||||
memset( &iop, 0, sizeof( iop ) );
|
memset( &iop, 0, sizeof( iop ) );
|
||||||
@@ -689,7 +717,14 @@ static void test_set_attributes_error(void)
|
|||||||
|
|
||||||
rtems_resource_snapshot_take( &snapshot );
|
rtems_resource_snapshot_take( &snapshot );
|
||||||
|
|
||||||
sc = rtems_termios_device_install( &dev[0], major, minor, &handler, &done );
|
sc = rtems_termios_device_install(
|
||||||
|
&dev[0],
|
||||||
|
major,
|
||||||
|
minor,
|
||||||
|
&handler,
|
||||||
|
NULL,
|
||||||
|
&done
|
||||||
|
);
|
||||||
rtems_test_assert( sc == RTEMS_SUCCESSFUL );
|
rtems_test_assert( sc == RTEMS_SUCCESSFUL );
|
||||||
|
|
||||||
memset( &iop, 0, sizeof( iop ) );
|
memset( &iop, 0, sizeof( iop ) );
|
||||||
|
|||||||
Reference in New Issue
Block a user