Пример пользовательского пространства Linux для протокола rpmsg-lite - PullRequest
0 голосов
/ 26 сентября 2018

Я использую двухъядерную плату imx, в которой ОС Linux работает на одном ядре, а ОСРВ во втором ядре (M4).Я хочу общаться между ядрами, используя RPMsg.Я ищу пользовательское приложение в Linux для доступа к каналу rpmsg с помощью основных команд open, read, write.Я создал канал rpmsg в соответствии с примером 'rpmsg_lite_str_echo_rtos' из NXP.Мне удалось создать виртуальный tty '/ dev / RPMSG'.Также я смог отправить данные в ядро ​​M4 с помощью команды echo из linux.Теперь мне требуется автоматизировать этот процесс с помощью простого кода на языке c.Я думаю, что смогу сделать это, используя простые команды чтения, записи, верно?Я попытался записать данные в цикле while (в / dev / RPMSG) и прочитать подтверждение от ядра M4, используя простые команды open, read, write.Но все, что я получал в m4, было несколько случайных байтов и ненужных данных.Также я не мог прочитать данные из m4 с помощью команды чтения.Я что-то здесь упускаю?

1 Ответ

0 голосов
/ 13 августа 2019

Для ядер Linux:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>    // file control
#include <termios.h>  // POSIX terminal control
#include <sched.h>

#define DEVICE "/dev/ttyRPMSG0"

int main(void)
{
    int fd;
    struct termios tty;
    char buf[100];
    int len;

    printf("Opening device...\n");
    fd = open( DEVICE, O_RDWR | O_NOCTTY | O_NDELAY );    // read/write, no console, no delay
    if ( fd < 0 )
    {
        printf("Error, cannot open device\n");
        return 1;
    }

    tcgetattr( fd, &tty );              // get current attributes
    cfmakeraw( &tty );                  // raw input
    tty.c_cc[ VMIN ] = 0;               // non blocking
    tty.c_cc[ VTIME ] = 0;              // non blocking
    tcsetattr( fd, TCSANOW, &tty ); // write attributes
    printf( "Device is open\n" );
    for ( ;; )
    {
        len = read( fd, buf, sizeof( buf ) );
        if ( len > 0 )
        {
            buf[ len ] = '\0';
            printf( "%s \r\n", buf );
        }
        else
        {
            sched_yield();
        }
    }
    return EXIT_SUCCESS;
}

Источник: https://www.toradex.com/community/questions/30653/rpmsg-protocol-failing-with-ims-rpmsg-tty-on-linux.html

...