Итак, следуя коду, найденному в LDD, я получил нижеприведенный код, в котором я добавляю device_create, чтобы получить файл устройства при загрузке модуля (за исключением проверок на ошибки, чтобы соответствовать коду здесь). Также есть mock_tty_register_device
и некоторые другие изменения, которые были созданы, чтобы избежать проверок количества циклов устройства и драйвера-> num.
Я не могу открыть ни одно устройство с указанными c нумерация в соответствии с примерами LDD, и не открывайте ttyO5 с кодом ниже в gpsd, который выплевывает Ошибка разрешения (несмотря на появление правого разрешения через ls ). Есть предложения?
static int __init tiny_init( void )
{
int retval;
struct device* retDevice = NULL;
/* allocate the tty driver */
tiny_tty_driver = alloc_tty_driver( DEVICES_N );
tiny_tty_driver->owner = THIS_MODULE;
tiny_tty_driver->driver_name = "tty_mock";
tiny_tty_driver->name = "ttyO";
tiny_tty_driver->major = 0, // to be assigned later
tiny_tty_driver->minor_start = 5, // device minor number
tiny_tty_driver->type = TTY_DRIVER_TYPE_SERIAL,
tiny_tty_driver->subtype = SERIAL_TYPE_NORMAL,
tiny_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV,
tiny_tty_driver->init_termios = tty_std_termios;
tiny_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | CSIZE | CLOCAL;
tty_set_operations( tiny_tty_driver, &serial_ops );
tty_port_init( &tiny_tty_port );
tiny_tty_driver->ports[0] = &tiny_tty_port;
/* register the tty driver */
retval = tty_register_driver( tiny_tty_driver );
tty_class = class_create( THIS_MODULE, tiny_tty_driver->name );
retDevice = mock_tty_register_device( tiny_tty_driver, 5, NULL );
//retDevice = tty_register_device( tiny_tty_driver, 5, NULL );
//tty_init_dev also
devt = MKDEV( tiny_tty_driver->major, tiny_tty_driver->minor_start );
retDevice = device_create( tty_class, NULL, devt, NULL, "ttyO5" );
return retval;
}