BSP and Device Driver Development Guide
The UART generally generates interrupts when it is ready to accept or to emit a number of characters. In this mode, the interrupt subroutine is the core of the driver.
The my_driver_interrupt_handler is responsible for processing
asynchronous interrupts from the UART. There may be multiple interrupt
handlers for a single UART. Some UARTs can generate a unique interrupt vector
for each interrupt source such as a character has been received or the
transmitter is ready for another character.
In the simplest case, the my_driver_interrupt_handler will have to check
the status of the UART and determine what caused the interrupt. The following
describes the operation of an my_driver_interrupt_handler which has to
do this:
static void my_driver_interrupt_handler(
rtems_vector_number vector,
void *arg
)
{
my_driver_entry *e = (my_driver_entry *) arg;
char buf [N];
int n = 0;
/*
* Check if we have received something. The function reads the
* received characters from the device and stores them in the
* buffer. It returns the number of read characters.
*/
n = my_driver_read_received_chars(e, buf, N);
if (n > 0) {
/* Hand the data over to the Termios infrastructure */
rtems_termios_enqueue_raw_characters(e->tty, buf, n);
}
/*
* Check if we have something transmitted. The functions returns
* the number of transmitted characters since the last write to the
* device.
*/
n = my_driver_transmitted_chars(e);
if (n > 0) {
/*
* Notify Termios that we have transmitted some characters. It
* will call now the interrupt write function if more characters
* are ready for transmission.
*/
rtems_termios_dequeue_characters(e->tty, n);
}
}
The my_driver_interrupt_write function is responsible for telling the
device that the n characters at buf are to be transmitted. The
return value may be arbitrary since it is not checked from Termios.
static int my_driver_interrupt_write(int minor, const char *buf, int n)
{
my_driver_entry *e = &my_driver_table [minor];
/*
* There is no need to check the minor number since it is derived
* from a file descriptor. The upper layer takes care that it is
* in a valid range.
*/
/*
* Tell the device to transmit some characters from buf (less than
* or equal to n). If the device is finished it should raise an
* interrupt. The interrupt handler will notify Termios that these
* characters have been transmitted and this may trigger this write
* function again. You may have to store the number of outstanding
* characters in the device data structure.
*/
return 0;
}
BSP and Device Driver Development Guide
Copyright © 1988-2008 OAR Corporation