Конструкция выходного дня. Часть 2 - Linux 3.9.11 и DHT22

После пайки и сборки осталось оживить нашу железяку...

 

 

В нашей Wiki описан достаточно подробно процесс сборки ядра и файловой системы для модуля SE-iMX287-Micro. Поэтому на нем останавливаться не будем. Датчик DHT22 имеет собственный однопроводный интерфейс передачи данных, чем-то схожий с 1-Wire. Было желание перенести общение с датчиком из юзер-спейса (программа опрашивающая состояние сенсора) в кернел- спейс, поручив общение с датчиком драйверу. Поиск по интернету привел к драйверу dht22-gpio.c написанный Харольдом Гейером (Harald Geyer) для 3 версии Линукс. Поскольку до этого мы использовали ядро 2.6.35 возникло искушение попробовать собрать ядро 3.9.11 включив в него вышеупомянутый драйвер.

Затягиваем ядро с kernel.org. В отличии от версии 2.6.35, где были борд файлы для процессора iMX28 здесь процессоры iMX23/iMX28 объединены в mach-mxs. Задаем нужный нам конфиг :

make -j2 CROSS_COMPILE=/opt/arm-2009q3/bin/arm-none-linux-gnueabi- ARCH=arm mxs_defconfig

Вызываем menuconfig:

make -j2 CROSS_COMPILE=/opt/arm-2009q3/bin/arm-none-linux-gnueabi- ARCH=arm menuconfig

Пока ничего не меняем, просто соберем для проверки. Собираем ядро:

make -j2 CROSS_COMPILE=/opt/arm-2009q3/bin/arm-none-linux-gnueabi- ARCH=arm uImage

Ядро собралось, запускаем u-boot изменяем в нем командную строку с console=ttyAM0 на consolde=ttyAMA0 , загружаем ядро по tftp

tftpboot 0x42000000 uImage

и стартуем

bootm 0x42000000

Наблюдаем, что ядро стартовать не хочет. Читаем интернет и с удивлением узнаем, что в последних версиях используются еще dts файлы (Device Tree Source) в которых описываются назначения выводов. В данном файле необходимо описать нужные функции выводов и собрать его. В папке arch/arm/boot/dts находятся dts файлы различных плат. Мы выбрали imx28-evk.dts. Собираем его:

make -j2 CROSS_COMPILE=/opt/arm-2009q3/bin/arm-none-linux-gnueabi- ARCH=arm imx28-evk.dtb

Собранный файл imx28-evk.dtb будет находиться в той же папке arch/arm/boot/dts.

Опять запускаем u-boot и загружаем собранное ранее ядро и dtb файл:

tftp 0x42000000 uImage; tftp 0x41000000 imx28-evk.dtb

и опять стартуем:

bootm 0x42000000 - 0x41000000

Бегущий по экрану лог показывает, что мы на правильном пути.

После успешного запуска ядра, задаемся вопросом, как его грузить с SD карты или NAND Flash. Для загрузки с этих источников нам необходим сгенерированный imx28_ivt_linux.sb. Поиск в интернете быстро показывает следующее – необходимо сначала создать объединенный файл zImage + dtb, а затем утилитой elftosb превратить его в *.sb файл. Чтобы объединить сгенерированный dtb файл с zImage выполняем:

cat arch/arm/boot/zImage arch/arm/boot/dts/imx28-evk.dtb > arch/arm/boot/zImage_dtb

Результирующий файл zImage_dtb будет лежать в arch/arm/boot.

Теперь утилитой elftosb создадим imx28_ivt_linux.sb:

elftosb -z -f imx28 -c ./linux_ivt.bd -o imx28_ivt_linux.sb

Теперь можно записывать его в SD карту, в микросхему NAND Flash и т.п. как это описано в Wiki.

Ядро стартует, теперь займемся прикручиванием  драйвера датчика DHT22. Правим файлы:

в drivers/iio/common/Kconfig добавляем:

source "drivers/iio/humidity/Kconfig"

в /drivers/iio/Makefile b/drivers/iio/Makefile добавляем:

obj-y += humidity/

Создаем файл /drivers/iio/humidity/Kconfig

#

# humidity sensor drivers

#

menu "Humidity sensors"

config DHT11_GPIO

tristate "DHT11 (and compatible sensors) driver"

help

This driver supports reading data via a single interrupts

generating GPIO line. Currently tested are DHT11 and DHT22.

Other sensors should work as well as long as they speak the

same protocoll.

endmenu

Создаем файл /drivers/iio/humidity/Makefile

#

# Makefile for IIO humidity sensor drivers

#

obj-$(CONFIG_DHT11_GPIO) += dht11-gpio.o

Сам драйвер копируем в /drivers/iio/humidity/dht11-gpio.c b/drivers/iio/humidity/dht11-gpio.c

Подсказка. Можно просто применить этот патч))

Пересобираем ядро. Загружаем его в плату. Проверяем, убеждаемся что он не хочет работать. Из 20 обращений температуру вычитывает 1-2 раза. Что-то не так с прерываниями. Пишем автору драйвера письмо с вопросом. Пока ждем ответа - думаем. Возникает желание купить китайский термометр-гигрометр и промотать его скотчем к корпусу. Еще купить бинокль и подарить сисадмину, пусть бесконтакно-оптически считывает показания. Сисадмин возражает, что из метро неудобно считывать показания. Думаем.

Говорят, что если умные мысли не приходят в голову, то они не приходят никуда. Отправляем экземпляр устройства автору драйвера, чтобы он попробовал разобраться. Тем временем заказываем у Silabs образцы их датчика SI7005. Маленький датчик, размером 4*4 мм подключается по шине I2C. Драйвер для Линукс имеется, решаем его попробовать. Пока образцы летят, заказываем маленькие платку, чтобы запаять на нее датчик. Драйвер сходу собирается в ядре  2.6.35. В новом 3.9.11 его приходится немного рихтовать. Как подключается драйвер?

1. Копируем сам файл si7005.c  в папку drivers/hwmon

2. В этой же папке правим файл Kconfig, добавляем туда:

config SENSORS_SI7005

tristate "Silabs SI7005 Temperature/Humidity Sensor"

depends on I2C

help

If you say yes here you get support for the Silabs SI7005

temperature/humidity  monitoring chip.

3. В той же папке правим Makefile, добавляем строку:

obj-$(CONFIG_SENSORS_SI7005)    += si7005.o

 

Все, осталось вызвать menuconfig, зайти в Device Drivers -> Hardware Monitoring и поставить галку на SI7005.

Пересобираем ядро, загружаем его в плату, видим в логе:

root /root # dmesg | grep -i si7005

[    2.700170] Si7005: probe 0-0040

[    2.707213] Si7005: hwmon hwmon0

Пробуем прочитать текущую температуру и влажность:

root /root # cat /sys/class/hwmon/hwmon0/device/humidity1_input

[  129.176631] Si7005: show humidity 0-0040

26113

root /root # cat /sys/class/hwmon/hwmon0/device/temp1_input

[  138.909703] Si7005: show temperature 0-0040

24968

Датчик отвечает. В принципе с железной частью окончено. Что делаем дальше? Запускаем интерфейсы Ethernet, Wi-Fi, подключаем USB модем. Затем пишем скрипт для чтения датчика, запускаем apache и mrtg чтобы можно было строить графики влажности/температуры и разглядывать их через браузер. Также напишем несколько скриптов для управления набортными реле. Если автор драйвера DHT11 что-то исправит, то мы проверим и этот датчик.

Продолжение в 3 части.

 

 

<- Начало Продолжение ->