Добрый день.
Начал переходить с Bare metal на Linux.
Пытаюсь разобраться как написать простенький драйвер для моей ip core. Пока это просто 8 лампочек.
Борда: zedboard.
Сейчас читаю литературу, т.к. до этого не было опыта написания драйверов.
1) Не рекомендуется писать драйвер под файловую систему /dev. Раньше конечно так делали. Сейчас, якобы актуально писать под файловую систему /proc или /sys.
Верно ли это? Хочется сразу научиться праивльным вещам. Т.е. может при написании драйвера под какую-нибудь фс скрываются ккаие-то подводные камни. И есть резон писать под другую фс.
2) Почитал http://electronix.ru/redirect.php?https://linuxseekernel.blogspot.com/2014/05/platform-device-driver-practical.html и, честно говоря, так и не понял какое различие между:
Platform Driver
Platform Device
а) Создать виртуальный файл в файловой системе. Чтобы в него можно было писать/читать и т.д.
б) Связать этот виртуальный файл с физическим устройством.
1) Когда разбирался с драйверами(полтора года назад) не видел рекомендаций об отказе от файлов в /dev, были рекомендации не использовать функцию ioctl для управления настройками устройства/драйвера, в пользу управления настойками через файлы в /sys
2) Device - это устройство, в вашем случае "лампочки", Driver - это программа управляющая этим устройством, которую вы разрабатываете. Platform - значит, что усройство встоенное, т.е. всегда подключено.
Т.е. это две разные сущности - встроенное устройство(железо) и драйвер для встроенного устойства(программа).
3) Я бы сказал написание драйвера это написание функций-обработчиков чтения/записи и т.д файлов. Создание файла устойства и связь его с устойством(драйвером) сейсас дело пару сток, в вашем случае это делает функция proc_create().
4) base_addr - связан с регистрами устойства "лампочки", если у этого устойства несколько подряд идущих регистров(и это описано в конфигурационных файлах), то да, к ним можно обращаться смещаясь относитльно base_addr.
Спасибо!
От себя только добавлю, что тема про Platform device и Platform driver хорошо раскрыта http://electronix.ru/redirect.php?https://kerneltweaks.wordpress.com/2014/03/30/.
Случайно увидел ваш вопрос. Пишите про Линукс в теме Линукс.
1) Не рекомендуется писать драйвер под файловую систему /dev. Раньше конечно так делали. Сейчас, якобы актуально писать под файловую систему /proc или /sys.
Верно ли это? Хочется сразу научиться праивльным вещам. maniac.gif Т.е. может при написании драйвера под какую-нибудь фс скрываются ккаие-то подводные камни. И есть резон писать под другую фс.
В этом вопросе каша.
На самом деле все происходит таким образом:
Вы регистрируете драйвер, ядро записывает информацию о нем в соответствующие структуры и драйвер появляется в /sys/.
В дереве устройств вы описываете устройство для этого драйвера (в /sys появятся записи об устройстве) и если они (драйвер и устройство) соответствуют друг другу, то вызовется функция драйвера probe. Если probe не вернет ошибку, то устройство встало и подключилось к драйверу. Если у вас написано правило для этого устройства в правилах udev, то в /dev появится псевдофайл для доступа к вашему устройству. Если нет, то его можно создать при помощи команды mknod.
platform device:
Вы наверняка за обилием информации не заметили важнейшего момента, что драйвер и устройство должны СООТВЕТСТВОВАТЬ друг другу. На самом деле драйверы (о блоковых драйверах мы вообще не говорим) подразделяются на несколько групп. Список этих групп вы найдете в разделе шин: /sys/bus/ Оказалось, что есть такая группа, которую ни к одной шине отнести нельзя. Ее назвали platform.
Внутри каждой группы свои правила по которым проверяется соответствие драйвера и устройства. Для PCI и USB это Vendor ID и Product ID, для platform это просто текстовое имя. Это должно совпасть в драйвере и устройстве.
На самом деле есть еще нюансы, но в целом картина выглядит таким образом.
1.
Речь не идет о поддается обнаружению. Если в дереве устойств есть и зарегистрирован драйвер, то драйвер ставится и устройство готово работать. Для pug&play устройств тоже надо в дереве описывать. Там просто еще дополнительный механизм.
Почему описывают структуру platform device я уже написал. До версии ядра 3.Х.Х все устройства описывались структурами, а после появилось дерево, которое компилируется отдельно и не надо перестраивать ядро.
/dev это не то же самое что /proc и /sys две последние примерно одно и то же. первая пришла из юникса. В них отображаются внутренние структуры ядра, а в /dev расположены pipes для связи с устройствами. Все драйвера, к которым нужно иметь доступ из пространства пользователя отображены в /dev.
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)