простое символьное устройство в ритмах - PullRequest
0 голосов
/ 27 октября 2019

Я новичок в RTEMS и хочу написать для него очень простое символьное устройство, но когда я ищу в Интернете, я ничего не могу найти.

Я могу написать символьное устройстводля Linux, но не имеет никакого опыта в RTEMS.

Я хочу написать символьное устройство, имеющее 3 функции: init (), exit (), read ().

и когда я вызываю read, просто возвращаю строку.

Есть ли какая-либо ссылка, чтобы дать мне подсказку для написания этого простого драйвера устройства?

1 Ответ

1 голос
/ 27 октября 2019

Возможно, это немного зависит от того, что вы подразумеваете под «простым символьным устройством». Я предполагаю, что вам нужно что-то, что доступно через интерфейс устройства (аналогично символьным устройствам Linux).

В RTEMS есть некоторые платформы для I2C, SPI, последовательных портов и некоторые более простые интерфейсы. Довольно много драйверов извлекается из FreeBSD через libbsd и поэтому использует интерфейс FreeBSD. Аппаратное обеспечение, которое не соответствует ни одной из платформ, большую часть времени использует самоопределяемый интерфейс. Это также может быть интерфейс типа файла.

Если вы хотите использовать интерфейс типа файла, вам нужно взглянуть на IMFS_make_generic_node. Вы можете взглянуть на драйвер I2C для полностью работающего примера: https://git.rtems.org/rtems/tree/cpukit/dev/i2c/i2c-dev.c?id=94481cedc4165f6a49ef5287098251740922fee1#n147

Немного более минимальный пример может выглядеть следующим образом: Обратите внимание, что я пишу следующее более или менее из моей головы, так чтоможет быть довольно много опечаток, и вполне наверняка пропущены заголовки:

#include <rtems/imfs.h>

static ssize_t my_read(
  rtems_libio_t *iop,
  void *buffer,
  size_t count
)
{
  memset(buffer, 42, count);
  return count;
}

static const rtems_filesystem_file_handlers_r my_handler = {
    .open_h = rtems_filesystem_default_open,
    .close_h = rtems_filesystem_default_close,
    .read_h = my_read,
    .write_h = rtems_filesystem_default_write,
    .ioctl_h = rtems_filesystem_default_ioctl,
    .lseek_h = rtems_filesystem_default_lseek_file,
    .fstat_h = rtems_filesystem_default_fstat,
    .ftruncate_h = rtems_filesystem_default_ftruncate,
    .fsync_h = rtems_filesystem_default_fsync_or_fdatasync,
    .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
    .fcntl_h = rtems_filesystem_default_fcntl,
    .kqfilter_h = rtems_filesystem_default_kqfilter,
    .mmap_h = rtems_filesystem_default_mmap,
    .poll_h = rtems_filesystem_default_poll,
    .readv_h = rtems_filesystem_default_readv,
    .writev_h = rtems_filesystem_default_writev
};

static const IMFS_node_control my_node_control = IMFS_GENERIC_INITIALIZER(
  &my_handler,
  IMFS_node_initialize_generic,
  IMFS_node_destroy_default,
);

void my_Initialize( void )
{
  IMFS_make_generic_node(
    "/dev/my_dev",
    S_IFCHR | S_IRWXU | S_IRWXG | S_IRWXO,
    &my_node_control,
    NULL
  );
}

Вызов my_Initialize должен дать вам "/ dev / my_dev", где вы можете прочитать любое количество из 42, которое вы хотите.

...