Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: написание драйвер
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
Zelepuk
Хочется сделать такую вещь:
на уровне ядра забираются данные с датчика температуры по I2C и помещаются в массив. Как полусить эти данные в user space?
где можно найти хорошее описание как подоюный драйвер написать?
xor.kruger
например тут и тут
kurtis
Что значит "на уровне ядра"?
Вы из userspace можете получить доступ к шине i2c? Если да, то тогда все предельно просто, вам достаточно посмотреть как реализованы i2c-tools и сделать по аналогии.

Цитата
Как полусить эти данные в user space?

1. Сделать запись в sysfs. При чтении из этой записи, делайте printk() вашего массива
2. Добавить новый ioctl к драйверу, который работает с i2c датчиком.
3. Можно через event-интерфейс, при получении новый измерений, в userspace отправляйте события, правда стандартный события могут не подойти, нужно будет что-то придумать.
4. Можно сокетами воспользоваться. Например, посмотреть как сделать netlink сокеты (через него udev узнает о новых устройствах).
5. Можно добавить свой собственный системный вызов, который будет печатать содержимое массива.
Zelepuk
Цитата(kurtis @ Jul 2 2012, 13:42) *
Что значит "на уровне ядра"?
Вы из userspace можете получить доступ к шине i2c? Если да, то тогда все предельно просто, вам достаточно посмотреть как реализованы i2c-tools и сделать по аналогии.


1. Сделать запись в sysfs. При чтении из этой записи, делайте printk() вашего массива
2. Добавить новый ioctl к драйверу, который работает с i2c датчиком.
3. Можно через event-интерфейс, при получении новый измерений, в userspace отправляйте события, правда стандартный события могут не подойти, нужно будет что-то придумать.
4. Можно сокетами воспользоваться. Например, посмотреть как сделать netlink сокеты (через него udev узнает о новых устройствах).
5. Можно добавить свой собственный системный вызов, который будет печатать содержимое массива.

из userspace могу управлять I2C. Есть специальный драйвер. Но мне нужно следующее:
по прерыванию от внешней микросхемы (аппаратное прерывание), забирать набор данных по I2C(или SPI, пока неважно) - всего 8 слов. и так 8000 раз в секунду.
пока знаю как сделать драйвер кнопки(для отработки прерывания), как вызвать в обработчике рперывания функцию считывания - непонятно. Как забрать эти данные через userspace - тоже с трудом представляю.
1. как сделать запись в sysfs?
2. как добавить ioctl?
3. как делаются системные вызовы?
kurtis
1. http://www.kernel.org/pub/linux/kernel/peo...2005/mochel.pdf , пример использования можно глянуть в drivers/rtc/rtc-sysfs.c, посмотреть что из написанного получается в реальной системе можно здесь /sys/class/rtc/rtc0/
2. в дереве ядра - find ./drivers -type f -print | xargs grep 'ioctl(' и смотрим тот файл что приглянулся
3. ну про системный вызов это шутка юмора была, проще через sysfs или ioctl сделать

Цитата
как вызвать в обработчике рперывания функцию считывания - непонятно

Скорее всего, напрямую вызывать не получится, т.к. функция считывания может спать. Нужно будет делать какую-то workqueue, куда в прерывании будет добавляться работа.

Цитата
8000 раз в секунду

Много, как бы система лагать не начала.
Dron_Gus
Цитата(Zelepuk @ Jul 2 2012, 17:41) *
всего 8 слов. и так 8000 раз в секунду.

По стандартному и2с не проезет. Это ж уже 512 КГц. Без учета старт-стопов.
Zelepuk
А если по SPI? я для примра I2C привёл.
Я хочу ADE7878 использовать, в ядре есть драйверы для ADE7758, но непонятно как их использовать и добавлять в систему, вот и решил я поизвращаться, анписав свой драйвер.
Курю книги пока...
Если забирать по SPI и данные(8000 раз в секунду), и считывать параметры энергии(5 раз в секунду), всё по прерываниям. Возможно? Хотя предполагается что есть отдельный SPI master для записи сырых двнных(которые 8000 раз в секунду), но, по даташиту видно, что оба порта на одних и тех же ногах физически, что странно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.