реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> написание драйвер, вывод переменных в user space
Zelepuk
сообщение Jul 2 2012, 08:50
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Хочется сделать такую вещь:
на уровне ядра забираются данные с датчика температуры по I2C и помещаются в массив. Как полусить эти данные в user space?
где можно найти хорошее описание как подоюный драйвер написать?
Go to the top of the page
 
+Quote Post
xor.kruger
сообщение Jul 2 2012, 10:21
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 290
Регистрация: 17-08-08
Из: Чернигов
Пользователь №: 39 647



например тут и тут
Go to the top of the page
 
+Quote Post
kurtis
сообщение Jul 2 2012, 10:42
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Что значит "на уровне ядра"?
Вы из userspace можете получить доступ к шине i2c? Если да, то тогда все предельно просто, вам достаточно посмотреть как реализованы i2c-tools и сделать по аналогии.

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

1. Сделать запись в sysfs. При чтении из этой записи, делайте printk() вашего массива
2. Добавить новый ioctl к драйверу, который работает с i2c датчиком.
3. Можно через event-интерфейс, при получении новый измерений, в userspace отправляйте события, правда стандартный события могут не подойти, нужно будет что-то придумать.
4. Можно сокетами воспользоваться. Например, посмотреть как сделать netlink сокеты (через него udev узнает о новых устройствах).
5. Можно добавить свой собственный системный вызов, который будет печатать содержимое массива.
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Jul 2 2012, 13:41
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(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. как делаются системные вызовы?

Сообщение отредактировал Zelepuk - Jul 2 2012, 13:49
Go to the top of the page
 
+Quote Post
kurtis
сообщение Jul 2 2012, 14:31
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



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 раз в секунду

Много, как бы система лагать не начала.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Jul 2 2012, 16:34
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



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

По стандартному и2с не проезет. Это ж уже 512 КГц. Без учета старт-стопов.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Jul 2 2012, 19:36
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



А если по SPI? я для примра I2C привёл.
Я хочу ADE7878 использовать, в ядре есть драйверы для ADE7758, но непонятно как их использовать и добавлять в систему, вот и решил я поизвращаться, анписав свой драйвер.
Курю книги пока...
Если забирать по SPI и данные(8000 раз в секунду), и считывать параметры энергии(5 раз в секунду), всё по прерываниям. Возможно? Хотя предполагается что есть отдельный SPI master для записи сырых двнных(которые 8000 раз в секунду), но, по даташиту видно, что оба порта на одних и тех же ногах физически, что странно.

Сообщение отредактировал Zelepuk - Jul 2 2012, 19:39
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 22:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01399 секунд с 7
ELECTRONIX ©2004-2016