LINUX.ORG.RU

ioctl в kernel space

 ,


0

2

Добрый день. Сильно не пинайте, в linux я, можно сказать, новичок. Но возникла задача такого плана: в устройстве под линухом один физический serial port, которым оно связано с другим устройством, к которому уже подключены всякие датчики и доп.устройства, в том числе SIM800 модем на одном из UART. Сейчас все передаваемые данные от датчиков заворачиваются в пакеты и отправляются устройству под линухом Но возникла задача общаться с модемом нативно, из самой системы, а не из приложения. Для этого был написан модуль, реализующий несколько виртуальных портов, который сам заворачивает/разворачивает пакеты, рассовывает данные по виртуальным портам и собирает оттуда передаваемые данные. Все это должно гоняться в физическом порту, на который драйвер садится при загрузке. Все бы хорошо, но гладко было на бумаге Не получается настроить параметры физического порта из kernel space, не нашел я, как это делается (( Подскажите советом, плз

А при чём тут ioctl? Задавай вопрос нормально

anonymous
()
Ответ на: комментарий от panzerito

пробовал через termios, не работает((

struct file* port;
struct tty_struct *tty;
mm_segment_t oldfs;

        oldfs=get_fs();
        set_fs(KERNEL_DS);

        port = filp_open(PHY_TTY, O_RDWR | O_NONBLOCK | O_NOCTTY, 0);

        if (IS_ERR (port))
        {
                printk(KERN_ERR "PORT: can't open PHY port '%s'\n", PHY_TTY);
                goto exit;
        }


        tty=(struct tty_struct*)port->private_data;

        tty->termios.c_cc[VTIME] = 20;
        tty->termios.c_cc[VMIN] = 0;
        tty->termios.c_cflag = CS8;  /*8 бит*/
        tty->termios.c_cflag |= B115200;

        tty->termios.c_lflag = 0;
        tty->termios.c_oflag = 0;

        tty->termios.c_iflag = 0;
        tty->termios.c_iflag &= ~ (INLCR | IGNCR | ICRNL);


exit:
        set_fs(oldfs);
        return port;
toweroff
() автор топика
Ответ на: комментарий от panzerito

Вот так регистрируются порты

int retval;
int i;

#ifdef SCULL_DEBUG
        printk(KERN_DEBUG "%s - \n", __FUNCTION__);
#endif

        // Catch the physical serial port
        F_ID = open_port();
        if (F_ID == NULL)
                return -ENOMEM;


        /* allocate the tty driver */
        ttywdt_tty_driver = alloc_tty_driver(TTY0TTY_MINORS);
        if (!ttywdt_tty_driver)
                return -ENOMEM;

        /* initialize the tty driver */
        ttywdt_tty_driver->owner = THIS_MODULE;
        ttywdt_tty_driver->driver_name = "ttyWDT vport";
        ttywdt_tty_driver->name = "ttyWDT";
        /* no more devfs subsystem */
        ttywdt_tty_driver->major = TTY0TTY_MAJOR;
        ttywdt_tty_driver->type = TTY_DRIVER_TYPE_SERIAL;
        ttywdt_tty_driver->subtype = SERIAL_TYPE_NORMAL;
        ttywdt_tty_driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW ;
        /* no more devfs subsystem */
        ttywdt_tty_driver->init_termios = tty_std_termios;
        ttywdt_tty_driver->init_termios.c_iflag = 0;
        ttywdt_tty_driver->init_termios.c_oflag = 0;
        ttywdt_tty_driver->init_termios.c_cflag = B230400 | CS8 | CREAD;
        ttywdt_tty_driver->init_termios.c_lflag = 0;
        ttywdt_tty_driver->init_termios.c_ispeed = 230400;
        ttywdt_tty_driver->init_termios.c_ospeed = 230400;


        tty_set_operations(ttywdt_tty_driver, &serial_ops);

        for(i=0;i<TTY0TTY_MINORS;i++)
        {
                tty_port_init(&tport[i]);
                tty_port_link_device(&tport[i],ttywdt_tty_driver, i);
        }

        retval = tty_register_driver(ttywdt_tty_driver);
        if (retval)
        {
                printk(KERN_ERR "Failed to register WDT tty driver");
                put_tty_driver(ttywdt_tty_driver);
                return retval;
        }
toweroff
() автор топика

/usr/src/linux/include/linux/serial_core.h
/usr/src/linux/drivers/tty/serial/serial_core.c

panzerito
()
Ответ на: комментарий от panzerito

только не пойму

зачем это. Сами создаваемые порты вполне себе работают Я не могу изменить скорость физического порта. Осцилл показывает четко 9600 8N1 передачу нуля

toweroff
() автор топика
Ответ на: только не пойму от toweroff

static struct tty_port tport[TTY0TTY_MINORS];

Так его еще нужно заполнить.

Все предыдущие вопросы в треде я задавал из-за интереса к такому драйверу.

/usr/src/linux/include/linux/serial_core.h использовал?

panzerito
()
Ответ на: комментарий от panzerito

так это

tport инициализируется во время открытия порта. коре.х - нет, не пользовал. Я, в силу скудности познаний, никак не пойму, как должна правильно настраиваться структура termios. Порт-то не мой. И в какой области он работает - тоже непонятно. Есть там передача kernel->user, user->kernel. Но уж если я в kernel, да через vfs... (хотя и kernel_read то же самое), но нихт орбайтн, нет печенек.

toweroff
() автор топика
Ответ на: комментарий от panzerito

Все предыдущие вопросы в треде я задавал из-за интереса к такому драйверу.

это переделанный tty0tty, на гитхабе

toweroff
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.