Ответы пользователя по тегу Драйверы
  • В чем возникает проблема при работе с драйвером порта - UART4?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Речь идет именно о RS485, UART подключен к микросхеме трансивера RS485. Пин RTS используется для организации полудуплексной передачи.

    Ок, я проглядел это место, давай попробуем ещё раз.

    Если вывод dev_err() поставить перед spin_lock_irqsave(&port->lock, flags); то всё работает.

    Верно ли, что когда всё работает (со вставленным dev_err), serial8250_em485_stop_tx вызывается после передачи только из serial8250_console_write, а когда всё не работает эта функция не вызывается вообще?

    Глядя в функцию serial8250_handle_irq я вижу, что обработка окончания передачи зависит от того, используется DMA или нет. Используется ли в вашей конфигурации DMA? Работает ли передача, если DMA отключить?
    Ответ написан
  • Почему не работает клавиатура?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему-то не работает прерывание 0х20 для клавиатуры

    я не буду отлаживать твой код, но предложу тебе несколько вопросов, которые помогут тебе посмотреть в нужные места:
    - посылает ли клавиатура вообще IRQ?
    - настроен ли контроллер прерываний на приём IRQ от клавиатуры?
    - размаскирована ли линия IRQ от клавиатуры в контроллере прерываний?
    - настроен ли контроллер прерываний на то чтобы вызывать int 0x20 в ответ на IRQ от клавиатуры? [1]
    - получает ли процессор прерывание от контроллера прерываний?
    - настроена ли запись в IDT для int 0x20 на вызов твоего обработчика?
    - разрешены ли прерывания в процессоре?

    [1] Коль скоро здесь ты установил базовый вектор первого PIC в 0x20, то клавиатура, посылая IRQ1, должна вызывать int 0x21.
    Ответ написан
    Комментировать
  • Почему не работает inportb(0x60)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    во-первых компилятор даёт предупреждение, … , но ошибки не производит. Я спокойно линкую файл недо-драйвера с основным ядром, (конечный результат - .efi),

    Дело в том, что у EFI-приложений нет динамической линковки, а неопределённый символ после копирования из .so в .efi просто ссылается в никуда. Если вывести неопределённые символы для bootx64.so, то inportb будет среди них:
    objdump -t bootx64.so | grep UND
    0000000000000000         *UND*  0000000000000000 inportb


    В qemu результат вызова этой функции выглядит так:
    Trace 0: 0x7fb15d338e80 [0000000000000000/000000007e6e22de/0x40c2b0]
    ----------------                      
    IN: 
    0x7e6e2081:  bf 60 00 00 00           movl     $0x60, %edi
    0x7e6e2086:  b8 00 00 00 00           movl     $0, %eax
    0x7e6e208b:  e8 90 57 00 00           callq    0x7e6e7820
    
    Trace 0: 0x7fb15d3390c0 [0000000000000000/000000007e6e2081/0x40c2b0]
    ----------------                      
    IN: 
    0x7e6e7820:  af                       scasl    (%rdi), %eax
    0x7e6e7821:  af                       scasl    (%rdi), %eax
    0x7e6e7822:  af                       scasl    (%rdi), %eax
    0x7e6e7823:  af                       scasl    (%rdi), %eax
    0x7e6e7824:  af                       scasl    (%rdi), %eax
    0x7e6e7825:  af                       scasl    (%rdi), %eax
    0x7e6e7826:  af                       scasl    (%rdi), %eax
    0x7e6e7827:  af                       scasl    (%rdi), %eax
    0x7e6e7828:  af                       scasl    (%rdi), %eax
    0x7e6e7829:  af                       scasl    (%rdi), %eax
    0x7e6e782a:  af                       scasl    (%rdi), %eax
    0x7e6e782b:  af                       scasl    (%rdi), %eax
    …


    С другой стороны, если предоставить такую функцию:
    unsigned char
    inportb(unsigned short port)
    {
            unsigned char v;
            asm volatile ("in {%1|%b0}, {%b0|%1}\n" : "=a"(v) : "d"(port));
            return v;
    }

    то она прекрасно вызывается и возвращает значение.

    Можно добавить опцию -zdefs в команду линковки чтобы получать ошибку линковки при наличии ссылок на неопределённые символы.

    Чтобы посмотреть, какой именно код выполняется, я запускаю qemu с монитором в консоли (дополнительным ключом -monitor stdio). Я нажимаю ESC когда в QEMU запускается tianocore и выбираю Boot Manager -> EFI Internal Shell, а там пишу fs0:efi\boot\bootx64.efi, после этого в мониторной консоли включаю логгирование (командами logfile log, log in_asm,exec), после чего нажимаю enter в консоли EFI. После этого можно смотреть в файл log и искать в нём знакомые байты из objdump.
    Ответ написан
  • Зачем использовать системный вызов poll для ожидания события от драйвера?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему бы сразу не блокировать поток вызовом read и не ждать пока данные будут доступны


    Если поток только читает, то действительно, на первый взгляд необходимости в вызове poll не видно.

    (в голову приходит только один вариант, когда необходимо принудительно прихлопнуть поток и если использовать таймаут, то не требуется прерывать системный вызов, хотя если принудительно завершить поток, то ядро по идее само прервет системный вызов)


    Если системный вызов втыкается в ожидание в драйвере, то драйвер сам решает, прерываемо это ожидание или нет. Может быть драйвер реализует операцию poll с возможностью прерывания, а read -- без.
    Ответ написан
    Комментировать
  • Синхронизация ресурсов в драйвере при системных вызовах?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В момент, когда функция read блокирована (по факту системный вызов (syscall) не вернул результат в пользовательское пространство), то при вызове другого системного вызова того же драйвера, например, write, необходимо ли в самом драйвере синхронизировать общие данные, которые используются и в read и в write?

    Да.

    Или выполнение системных вызовов как-то гарантировано регламентировано и прерывания отключены

    Нет, вообще никак не регламентировано.
    Ответ написан
  • Как заменить драйвер устройства находящегося в локальной сети?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Возможно ли это сделать на практике?

    Всё зависит в первую очередь от устройства "зайчика". В каких-то реализациях это может быть невозможно, в других -- возможно, но сложность может отличаться на порядки (от "существует готовый рецепт, требующий только написания кода" до "потребуется паяльник, осциллограф, анализатор сигналов, …").
    Универсального ответа нет, дать ответ без исследования железа невозможно.
    Ответ написан
    Комментировать
  • Почему зависает система после установки драйвера?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Чувак, нельзя из тасклета вызывать vfs. Потому что тасклет -- это атомарный контекст, а вызов vfs 100% блокирующий.
    Используй threaded IRQ handler (request_threaded_irq) или workqueue и вызывай VFS из контекста ядерного потока.
    Ответ написан
    Комментировать
  • Как использовать драйвер из андроид в линукс?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Посоветуйте, можно ли в линукс задействовать драйвер из андроида?
    Как это сделать?

    Скорее всего можно. Найти исходники этого андроида, скопировать исходники драйвера в исходники ядра своего линукса, интегрировать его в Kconfig и Makefile, собрать ядро.
    Ответ написан
    9 комментариев
  • Как тестировать драйвера?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Сразу скажу, комп у меня слабенький и ждать 3-4 часа чтоб понять что забыл в конце оператора точку с запятой поставить, это не хорошо?!

    При разработке необязательно использовать конфигурацию ядра со всеми включёнными опциями. Типичный конфиг который я использую при разработке собирается с нуля за 2 минуты.
    Кроме того, ядерный Makefile понимает цели вида *.o. Т.е. можно взять и откомпилировать один файл из дерева исходников ядра. Например: make init/main.o.
    Если ты меняешь что-то в исходниках, перекомпилироваться будет только то, что действительно зависит от того, что ты поменял. Поменяешь .c -- перекомпилируется единственный соответствующий ему файл .o.

    как можно тестировать компоненты ядра

    Это совсем другой вопрос. Под просто тестированием понимают проверку того, что код работает правильно, а не то, что он собрался.
    Ответ написан
    Комментировать
  • Каково взаимодействие autosleep и epoll?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    ведь есть autosleep!? Подскажите что это за сущность и почему ее нет в современных дистрибутивах?

    Потому что это андроидная фича. Но если хочется, можно пересобрать десктопное ядро и включить в нём CONFIG_AUTOSLEEP.

    Для понимания моей проблемы: есть слушающие сокеты и нужно после epoll_wait(). запускать комп из (наверное) ждущего режима

    Пробуждение машины по событию в периферийном устройстве -- это дело драйвера устройства совместно с самим устройством, к юзерспейсу и epoll_wait отношения не имеющее.
    Ответ написан
    Комментировать
  • Можно ли в Linux x64 собрать драйвер (модуль ядра) для Linux x86?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Всё что вам нужно, чтобы собрать модуль для ядра любой архитектуры любой версии -- это компилятор для этой архитектуры, исходники ядра и .config для этого ядра.
    Шаги такие:
    - распаковать/вычекнуть исходники ядра нужной версии
    - создать и сконфигурировать каталог сборки ядра: создать каталог, скопировать в него .config, выполнить
    make -C <каталог исходников ядра> \
    O=<каталог сборки ядра> \
    ARCH=<целевая архитектура> \
    CROSS_COMPILE=<префикс кросс-компилятора> \
    silentoldconfig

    - собрать ядро:
    make -C <каталог исходников ядра> \
    O=<каталог сборки ядра> \
    ARCH=<целевая архитектура> \
    CROSS_COMPILE=<префикс кросс-компилятора> \
    vmlinux

    - собрать модуль используя созданный на предыдущем шаге каталог:
    make -C <каталог сборки ядра> \
    M=<каталог исходников модуля> \
    ARCH=<целевая архитектура> \
    CROSS_COMPILE=<префикс кросс-компилятора> \
    modules


    CROSS_COMPILE можно опустить, если нужно использовать хостовый компилятор. Для x86 ARCH=x86
    Ответ написан
    1 комментарий
  • Как узнать MINOR номер устройства в современном linux в режиме ядра?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    filp->f_path.dentry->d_inode->i_rdev вместо filp->f_dentry->d_inode->i_rdev
    Ответ написан
  • Как сделать бесконечный счетчик времени в драйвере linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Ответьте себе на вопрос, что делают эти строчки в вашем коде :
    static enum hrtimer_restart ktfun( struct hrtimer *var ) {
       ...
       return data->numb-- > 0 ? HRTIMER_RESTART : HRTIMER_NORESTART;
    }
    static int __init init(void) {
        ...
        data->numb = CLOCK_MONOTONIC;
        ...
    }

    Ответ написан
    2 комментария
  • Чем отличается написание драйвера для PCI устройства в linux от написания драйвера для PCI-E устройства?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Нет разницы, но следует иметь в виду, что некоторые механизмы PCI -- это legacy для PCI-E, например не-MSI(X) прерывания.

    Пример драйвера: lxr.free-electrons.com/source/drivers/net/ethernet...
    Регистрация обработчика прерываний: lxr.free-electrons.com/source/drivers/net/ethernet...
    Ответ написан
    8 комментариев
  • Почему не проходит системный вызов ioctl?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Вы бы показали код всех структурок от девайса до файловых операций и код регистрации девайса в ядре.
    И заодно код вашего приложения, отправляющего ioctl.
    Ответ написан
    2 комментария
  • При каких условиях ядро linux игнорирует ioctl вызов из пространства пользователя?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    при работе через конфигурационный нод 0xff

    При работе через что?

    Вы посмотрите под strace, что туда уходит и что оттуда возвращается.
    Ответ написан
    Комментировать
  • Как эмулировать клавиатуру на уровне драйвера?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Может правильнее будет написать и установить GINA.dll?
    Ответ написан
  • Как случилось, что я купил три полумертвых жестких диска WD5000AAKX?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    А что вам не нравится-то в данных SMART? Винты чистые, почти не пользованные. Если хочется дополнительной уверенности -- запустите SMART-тест поверхности.

    Источник ошибки: Исправленная ошибка проверки компьютера

    Это, скорее всего, проблемы сборки/несовместимости компонент. Я бы начал с прогона memtest.
    Ответ написан
    Комментировать
  • Не запускается Linux после установки драйвера

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    появляется черный экран с кучей ошибок... что делать

    Прочитать и понять (с помощью, например, гугла), что за ошибки.
    В следующий раз (видимо, после переустановки) не просто бездумно копировать и выполнять команды, а попытаться понять, что они делают и к чему могут привести.
    Ответ написан
    Комментировать
  • Проблемы с установкой проприетарного драйвера wl на debian

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    > wl_linux.c:3470:2: error: implicit declaration of function ‘create_proc_entry’
    create_proc_entry выкинули в 3.9, предложив пользоваться create_proc_read_entry(), proc_create() и proc_create_data().
    По части остальных ошибок непонятно. Где можно посмотреть на код этого wl_linux.c?
    Ответ написан
    Комментировать