How can set serial driver in interrupt mode?

Gedare Bloom gedare at rtems.org
Mon Jul 13 15:05:07 UTC 2015


For problems with SPARC Leon 3 and RCC you may like to try contacting
the leon3/gaisler support, or including such a note in the subject
line of your email to catch the attention of someone who uses that
board/BSP.

Make sure all of your #define CONFIGURE_xxx come before #include
<confdefs.h>, as the confdefs.h reads those configure options to
figure out what to do.

Gedare

On Wed, Jul 8, 2015 at 6:56 AM, Ricardo Derbes <rmderbes at gmail.com> wrote:
> Hello.
> I'm trying to build an rtems application for leon3 with apbuart in
> interrupt mode, but polled mode is always used
> My setup is:
> RTEMS-4.10.2 (rtems-4.10-1.2.16-src.tar.bz2)
> RCC-1.2.16 RTEMS-4.10, GCC 4.4.6
> (sparc-rtems-4.10-gcc-4.4.6-1.2.16b-linux.tar.bz2)
> Both from Gaisler's site.
>
> The BSP is the default for RCC, leon3. (-qleon3)
> My system.h file is:
>
> #include <rtems.h>
> #define CONFIGURE_INIT
> #include <bsp.h>
> #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
> #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
>
> #define CONFIGURE_MAXIMUM_TASKS             4
> #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
>
> #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32
> #define CONFIGURE_EXTRA_TASK_STACKS    (3 * RTEMS_MINIMUM_STACK_SIZE)
> #define CONFIGURE_MAXIMUM_DRIVERS 4
>
> #include <rtems/confdefs.h>
>
> #ifdef RTEMS_DRVMGR_STARTUP
>     #ifdef LEON3
>         #include <drvmgr/ambapp_bus.h>
>         /* Add Timer and UART Driver */
>         #ifdef CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
>             #define CONFIGURE_DRIVER_AMBAPP_GAISLER_GPTIMER
>         #endif
>
>         #ifdef CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
>             #define CONFIGURE_DRIVER_AMBAPP_GAISLER_APBUART
>         #endif
>
>         /* APBUART0 */
>
>         struct drvmgr_key grlib_drv_res_apbuart0[] =
>         {
>             { "mode",   KEY_TYPE_INT, { (unsigned int) 0 } },
>             { "syscon", KEY_TYPE_INT, { (unsigned int) 1 } },
>             { "dbgcon", KEY_TYPE_INT, { (unsigned int) 1 } },
>             KEY_EMPTY
>         };
>
>         /*  APBUART1  */
>
>         struct drvmgr_key grlib_drv_res_apbuart1[] =
>         {
>             { "mode",   KEY_TYPE_INT, { (unsigned int) 1 } },
>             { "syscon", KEY_TYPE_INT, { (unsigned int) 0 } },
>             { "dbgcon", KEY_TYPE_INT, { (unsigned int) 0 } },
>             KEY_EMPTY
>         };
>
>         struct drvmgr_drv_res grlib_drv_resources[] =
>         {
>             {DRIVER_AMBAPP_GAISLER_APBUART_ID, 0, &grlib_drv_res_apbuart0[0]},
>             {DRIVER_AMBAPP_GAISLER_APBUART_ID, 1, &grlib_drv_res_apbuart1[0]},
>             RES_EMPTY
>         };
>
>     #endif
> #include <drvmgr/drvmgr_confdefs.h>
>
> And the code of my test application;
> #include "system.h"
> #include <termios.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <fcntl.h>
> #include <errno.h>
>
> #define BUFFSIZE  256
>
> rtems_task Init(rtems_task_argument ignored)
> {
>     #define RXSIZE (ssize_t)1024
>     int rxLen = 1;
>     char rxBuf[RXSIZE];
>     struct termios term;
>     static char *uart_name = { "/dev/console_b" };
>     int fd;
>     int32_t outCons; /* console file descriptor */
>     char outBuf[BUFFSIZE];
>     uint32_t nRead;
>     (void)(ignored);
>
>     if( (outCons = open("/dev/console", O_RDWR | O_NOCTTY)) < 0 )
>         exit(1);
>     sprintf(outBuf, "Starting\n");
>     write(outCons, outBuf, strlen(outBuf));
>
>     if( (fd = open(uart_name, O_RDWR | O_NOCTTY | O_NONBLOCK)) < 0 )
>     {
>         sprintf(outBuf, "Error opening %s: [%d] %s\n", uart_name,
> errno, strerror(errno));
>         write(outCons, outBuf, strlen(outBuf));
>         exit(1);
>     }
>
>     tcgetattr(fd, &term);
>     cfsetospeed(&term, B115200);
>     cfsetispeed(&term, B115200);
>     term.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ECHOPRT
> | ECHOCTL | ECHOKE | IEXTEN | ISIG);
>     term.c_cflag |= (CLOCAL | CREAD);
>     term.c_cflag |= CS8;
>     term.c_oflag &= ~OPOST;
>     term.c_iflag = IGNBRK;
>     tcsetattr(fd, TCSANOW, &term);
>     tcflush(fd, TCIOFLUSH);
>
>     while (1)
>     {
>         rxLen = read(fd, rxBuf, RXSIZE);
>         if( rxLen < 0)
>         {
>             sprintf(outBuf, "Error %d in read(): %s\n", errno, strerror(errno));
>             write(outCons, outBuf, strlen(outBuf));
>             exit(1);
>         }
>         nRead += rxLen;
>         if(rxLen == 0)
>             write(outCons, ".", 1);
>         else
>         {
>             sprintf(outBuf, "\nnRead: %d\n", (int)nRead);
>             write(outCons, outBuf, strlen(outBuf));
>         }
>     }
> }
>
> But debugging it, it always uses polled mode for apbuart[1] (and apbuart[0]
> I've found that in function
> apbuart_init1(struct drvmgr_dev *dev)
> when it gets keys value for "mode", it returns NULL, so mode is
> TERMIOS_POLLED and
> so the callbacks to be used are rtems_termios_callbacks = Callbacks_poll.
> How can I set up the serial driver in interrupt mode, without
> modifying apbuart_cons.c code
> and rebuild the BSP?
> Thank you.
> _______________________________________________
> users mailing list
> users at rtems.org
> http://lists.rtems.org/mailman/listinfo/users


More information about the users mailing list