Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > OpenWRT/LEDE

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.11.2014, 16:18   #1
mcsa
Junior Member
 
Регистрация: 13.02.2013
Сообщений: 29
Вес репутации: 0
mcsa is a splendid one to beholdmcsa is a splendid one to beholdmcsa is a splendid one to beholdmcsa is a splendid one to beholdmcsa is a splendid one to beholdmcsa is a splendid one to behold
По умолчанию Сенсор sht15(11)

Добрый день.

В составе hwmon есть драйвер для этого устройства. Добавил его, сбилдил прошивку, залил. В файловой системе появилась папка /bus/platform/drivers/sht15 c файликами bind, ubind, uevent
И что делать дальше не пойму. Где прописать какое gpio будет sck, какое data?
Там протокол похож на и2ц, но не совсем он.
mcsa вне форума   Ответить с цитированием
Старый 20.11.2014, 20:03   #2
mcsa
Junior Member
 
Регистрация: 13.02.2013
Сообщений: 29
Вес репутации: 0
mcsa is a splendid one to beholdmcsa is a splendid one to beholdmcsa is a splendid one to beholdmcsa is a splendid one to beholdmcsa is a splendid one to beholdmcsa is a splendid one to behold
По умолчанию Re: Сенсор sht15(11)

После недели "секса" удалось заставить этот датчик работать на 2х gpio. Если кому интересно могу описать как это сделать.
mcsa вне форума   Ответить с цитированием
Старый 20.11.2014, 20:15   #3
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Сенсор sht15(11)

Интересно, конечно
Admin вне форума   Ответить с цитированием
Старый 21.11.2014, 12:49   #4
mcsa
Junior Member
 
Регистрация: 13.02.2013
Сообщений: 29
Вес репутации: 0
mcsa is a splendid one to beholdmcsa is a splendid one to beholdmcsa is a splendid one to beholdmcsa is a splendid one to beholdmcsa is a splendid one to beholdmcsa is a splendid one to behold
По умолчанию Re: Сенсор sht15(11)

Раньше для подключения датчика SHT11 к Openwrt sht11 использовал конвертер SHT11-1W на PIC (http://www.fabiszewski.net/1-wire-slave/). В качестве головы использовал роутер TL-MR3020 и конвертер на CP2102 для подключения 1Wire и потом читал показания паченым Ditemp.
В этот раз для экспериментов я приобрел модуль Dragino HE (http://wiki.dragino.com/index.php?title=Dragino_HE). Это просто мечта после роутера (RAM: 64MB, Flash: 16MB, 14 multiplex GPIOs). Проц тот же AR9331, поддержка в Openwrt(barrier breaker) присутствует.
Нашел я в конфигурации ядра модуль для этого датчика в разделе HWMON (device drivers->hardware monitoring->sensirion humidity and temperature sensor. SHT15 and compat), собрал прошивку и все что увидел из изменений, что в дереве файловой системы появилась папка и больше ничего.

Код:
root@OpenWrt:~# ls -l /sys/bus/platform/drivers/sht15
--w-------    1 root     root          4096 Nov 21 07:33 bind
--w-------    1 root     root          4096 Nov 21 07:33 uevent
--w-------    1 root     root          4096 Nov 21 07:33 unbind
Я как бы понимал, что как-то надо это все дело инициализировать и указать какие gpio использовать. Гугление ни к чему особо хорошему не приводило. Находил ссылки на пачи и все. Т.е. народ пачи делает, но блин хоть, кто-нибудь написал бы как этим пользоваться. Есть документация, но там тоже ничего не сказано как это дело завести. Нашел файл (./build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.49/include/linux/platform_data/sht15.h)

Код:
/**
 * struct sht15_platform_data - sht15 connectivity info
 * @gpio_data:          no. of gpio to which bidirectional data line is
 *                      connected.
 * @gpio_sck:           no. of gpio to which the data clock is connected.
 * @supply_mv:          supply voltage in mv. Overridden by regulator if
 *                      available.
 * @checksum:           flag to indicate the checksum should be validated.
 * @no_otp_reload:      flag to indicate no reload from OTP.
 * @low_resolution:     flag to indicate the temp/humidity resolution to use.
 */
struct sht15_platform_data {
        int gpio_data;
        int gpio_sck;
        int supply_mv;
        bool checksum;
        bool no_otp_reload;
        bool low_resolution;
};
В нем описан тип структуры при помощи которого прописываются параметры для инициализации. Долго и нудно искал, что же дальше с этим делать. Может для людей, которые часто имеют дело с драйвера для линукс все понятно и прозрачно, но для меня это совсем не так. Долгое и нудное гугление привело меня таки на один пример инициализации єтого драйвера на какой-то АРМ плате (http://lxr.free-electrons.com/source...argate2.c#L140). По аналогии я внес следующие изменения в mach файл (этот файл для каждой платформы свой, для семейства плат на атеросе, файлы находятся тут ./target/linux/ar71xx/files/arch/mips/ath79. Файлы одинаковы по структуре. Нужный мне файл называется mach-dragino2.c, файл для mr3020 - mach-tl-mr3020.c)

В секции инклудов добавляем
Код:
//for sht15
#include <linux/platform_data/sht15.h>
#include <linux/platform_device.h>
//-----
После секции описания всякого рода ледов и кнопок вставляем
Код:
// SHT15 sensor platform_data
static struct sht15_platform_data platform_data_sht15 = {
.gpio_data =  27,
.gpio_sck  =  26,
//	.supply_mv = 3300,
.checksum = 1,
.low_resolution= 1,
 };
 
 static struct platform_device sht15 = {
         .name = "sht15",
         .id = -1,
         .dev = {
                 .platform_data = &platform_data_sht15,
         },
 };

// end of SHT15 sensor platform_data
Думаю понятно, что .gpio_data = 27 и .gpio_sck = 26 надо поменять на номера gpio, который будут использоваться. Остальные параметры интуитивно понятны и описаны в ранее найденом sht15.h. Зачем ему напряжение не особо понял.

В функцию с именем содержащим _setup, в моем случае static void __init dragino2_common_setup(void), у mr3020 - static void __init tl_mr3020_setup(void) в конец после инициализации других девайсов добавляем platform_device_register(&sht15);

После этого я пересобрал прошивку и опять ни фига не получилось, т.к. судя по сообщению
Код:
sht15 sht15.0: failed to get irq for data line
sht15: probe of sht15.0 failed with error -22
не удалось выделить прерывание под GPIO. Опять погуглив нашел нужный пач под платформу AR9331 (https://forum.openwrt.org/viewtopic.php?id=53256). Качаем тут https://raw.githubusercontent.com/GB...gpio-irq.patch, копируем в target/linux/ar71xx/patches-3.10 затем make clean; make V=99

После сборки ошибка по поводу прерывания пропала, появилась новая папка
Код:
root@OpenWrt:~# ls -l /sys/devices/platform/sht15/
lrwxrwxrwx    1 root     root             0 Nov 21 07:33 driver -> ../../../bus/platform/drivers/sht15
-rw-r--r--    1 root     root          4096 Nov 21 07:33 heater_enable
-r--r--r--    1 root     root          4096 Nov 21 07:33 humidity1_fault
-r--r--r--    1 root     root          4096 Nov 21 07:33 humidity1_input
drwxr-xr-x    3 root     root             0 Jan  1  1970 hwmon
-r--r--r--    1 root     root          4096 Nov 21 07:33 modalias
-r--r--r--    1 root     root          4096 Nov 21 07:33 name
lrwxrwxrwx    1 root     root             0 Nov 21 07:33 subsystem -> ../../../bus/platform
-r--r--r--    1 root     root          4096 Nov 21 07:33 temp1_fault
-r--r--r--    1 root     root          4096 Nov 21 07:33 temp1_input
-rw-r--r--    1 root     root          4096 Nov 21 07:33 uevent
Прицепил датчик на витой паре 3м длиной, в случае без контроля контрольной суммы, что-то читает, но полный бред, типа -47 градусов. С контрольной суммой пишет, что типа устройство занято. Прицепил кондер на питание около датчика, уменьшил номинал подтягивающих резисторов - результата нуль. Прицепил короткие провода сантиметров 10 - заработало. Думаю, если ничего не получается, надо инструкцию почитать (http://courses.cs.tau.ac.il/embedded...losB/SHT11.pdf). Смотрю на тайминги, слот под 0 или 1 минимальный при 5в 100 наносек. Открываю исходник драйвера (./build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.49/drivers/hwmon/sht15.c), смотрю тайминги, они предельные
Код:
#define SHT15_TSCKL			100	
#define SHT15_TSCKH			100
Не долго думая увеличиваю в 10 раз
Код:
#define SHT15_TSCKL			1000	
#define SHT15_TSCKH			1000
Пересобираю. И “О ЧУДО!!!”, оно наконец-то заработало
Код:
root@OpenWrt:~# cat /sys/devices/platform/sht15/temp1_input
25000
root@OpenWrt:~# cat /sys/devices/platform/sht15/humidity1_input
36742
Писал по памяти, не исключено, что что-то забыл.

Из идей на будущее, надо как-то сделать инициализацию, что бы можно было выбирать GPIO и другие параметры. Или отдельный пакет сделать или будет откуда-нибудь считывать данные, например из файла.

Последний раз редактировалось mcsa; 21.11.2014 в 12:55.
mcsa вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 14:04. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика