Serial device access with qemu!

Joel Sherrill joel.sherrill at OARcorp.com
Tue Nov 23 16:02:54 UTC 2010


On 11/23/2010 09:24 AM, Jeferson Luiz Rodrigues Souza wrote:
> Dear Joel,
>
> On Tue, Nov 23, 2010 at 2:21 PM, Joel Sherrill 
> <joel.sherrill at oarcorp.com <mailto:joel.sherrill at oarcorp.com>> wrote:
>
>     On 11/23/2010 02:50 AM, Jeferson Luiz Rodrigues Souza wrote:
>
>         Hi everyone,
>
>         I am trying to access a serial port in RTEMS 4.9.4 using a
>         pc586 bsp. However, when I execute the application using qemu
>         the code cannot open the device, and the perror() function
>         presents the following message: "No such file or directory".
>         It seems that RTEMS did not initialize a properly driver to
>         handle serial device. Is it right?
>
>         The qemu command line is:
>
>         sudo qemu -serial "/dev/ttyS0" -fda floppy.img -boot a
>
>         I made a search in this list and I found references about
>         serial port access but nothing to help in my case. Could
>         anyone help me or point me some documentation about serial
>         port access in RTEMS?
>
>         The code used in the test is presented below. I do not have
>         some experience with RTEMS and I do not know the source of
>         this problem.
>
>     The /dev/ttyS0 above is the host serial port.  The -serial says
>     attach attach the serial port COM1 on the target simulator
>     PC to the specified device.  So you are attaching the virtual
>     COM1 to the real serial port on the host /dev/ttyS0. Is that
>     what you intend to do?
>
>     FWIW COM1 --> /dev/ttyS1
>     COM2 --> /dev/ttyS2
>
>     on the RTEMS target.
>
>
> I need to read some data from a device connected in the host serial 
> port (e.g. /dev/ttyS0) inside an application running in RTEMS with 
> qemu.  So, is my source code correct? or Do I need some extra 
> configuration?
>
> Where is the name of serial devices in RTEMS defined? I tried use the 
> open() function as follows:
>
>  int serial_fp = open("/dev/ttyS0",O_RDONLY);
> or
>  int serial_fp = open("/dev/ttyS1",O_RDONLY);
> or
>  int serial_fp = open("COM1",O_RDONLY);
>
> and got the same message when I checked the serial_fp value and print 
> the error message using perror() function: "No such file or directory"
This is how if should work based upon the head.

#include <bsp/tty_drv.h>

...

#define CONFIGURE_APPLICATION_EXTRA_DRIVERS \
   TTY1_DRIVER_TABLE_ENTRY, TTY2_DRIVER_TABLE_ENTRY

and you should have /dev/ttyS1 for COM1

You can tinker with the configuration of the fileio.exe example, login
as rtems, and do an "ls" on /dev to see what devices there are.

--joel
>
> Thanks to reply,
>
> Best regards,
> Jeferson.
>
>     --joel
>
>         Thanks,
>         jefecomp.
>
>
>         #include <signal.h>
>         #include <stdlib.h>
>         #include <stdio.h>
>         #include <pthread.h>
>         #include <uart.h>
>         #include <termios.h>
>         #include<sched.h>
>         #include <bsp.h>
>         #include <fcntl.h>
>         #include <sys/types.h>
>         #include <sys/stat.h>
>
>         #define CONFIGURE_INIT
>         #include <rtems.h>
>
>
>         void *POSIX_Init();
>
>         #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
>         #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
>         #define CONFIGURE_APPLICATIONS_NEEDS_RTC_DRIVER
>         #define CONFIGURE_MICROSECONDS_PER_TICK 1000
>
>         #define CONFIGURE_MAXIMUM_POSIX_THREADS 10
>         #define CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES 10
>         #define CONFIGURE_MAXIMUM_POSIX_MUTEXES 10
>         #define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES 10
>         #define CONFIGURE_MAXIMUM_POSIX_TIMERS 10
>         #define CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS 40
>         #define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES 10
>         #define CONFIGURE_POSIX_INIT_THREAD_TABLE
>         #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 5
>         #define CONFIGURE_NUMBER_OF_TERMIOS_PORTS 3
>         #include<rtems/confdefs.h>
>
>         void *POSIX_Init()
>         {
>            printf("Serial Port Test!!!\n");
>
>            char buffer[255];
>            int bytesRead;
>            int serial_fp = open("/dev/ttyS0",O_RDONLY);
>
>            printf("SERIAL_FP = %i\n",serial_fp);
>
>            if(serial_fp < 0)
>            {
>                printf("FAILURE TO OPEN SERIAL PORT\n");
>                perror(serial_fp);
>                exit(-1);
>            }
>
>            //write(serial_fp,buffer,strlen(buffer)+1);
>            bytesRead = read(serial_fp, buffer, 255);
>
>
>            if(bytesRead < 0)
>            {
>                printf("Problems in the read of Serial Port");
>                close(serial_fp);
>                exit(1);
>            }
>            else
>                buffer[bytesRead] = 0;
>
>
>            printf(buffer);
>
>            close(serial_fp);
>            exit(0);
>         }
>
>
>
>     -- 
>     Joel Sherrill, Ph.D.             Director of Research&  Development
>     joel.sherrill at OARcorp.com        On-Line Applications Research
>     Ask me about RTEMS: a free RTOS  Huntsville AL 35805
>       Support Available             (256) 722-9985
>
>
>


-- 
Joel Sherrill, Ph.D.             Director of Research&  Development
joel.sherrill at OARcorp.com        On-Line Applications Research
Ask me about RTEMS: a free RTOS  Huntsville AL 35805
    Support Available             (256) 722-9985





More information about the users mailing list