24 декабря 2013 г.

Подключение контроллера сети 1-wire (DS9490R) к Cubietruck. Первое устройство в сети 1-wire (ds2401).

Ну что, теперь можно раскрыть секрет - не просто так же покупался cubietruck. А покупался он для создания сети умного дома 1-wire. Что это такое рассказывать не буду, в интернете полно информации. Просто буду записывать некоторые не очевидные для меня, как чайника вещи. Итак, для начала подключим контроллер DS9490R к нашему cubietruck.
Вставляем контроллер в cubietruck.


# dmesg
[  512.230242] The port change to OHCI now!
[  512.532997] usb 5-1: new full-speed USB device number 2 using sw-ohci
# apt-get install owfs
# lsusb
Bus 005 Device 003: ID 04fa:2490 Dallas Semiconductor DS1490F 2-in-1 Fob, 1-Wire adapter
# mkdir /mnt/1wire
# owfs -C -uall -m /mnt/1wire --allow_other
# ls -lah /mnt/1wire
total 4.0K
drwxr-xr-x 1 root root    8 Dec 24 06:15 .
drwxr-xr-x 4 root root 4.0K Dec 24 06:14 ..
drwxrwxrwx 1 root root    8 Dec 24 06:16 05.4AEC29CDBAAB
drwxrwxrwx 1 root root    8 Dec 24 06:16 10.67C6697351FF
drwxrwxrwx 1 root root    8 Dec 24 06:16 81.EE6F32000000
drwxr-xr-x 1 root root    8 Dec 24 06:15 alarm
drwxr-xr-x 1 root root    8 Dec 24 06:15 bus.0
drwxr-xr-x 1 root root    8 Dec 24 06:15 bus.1
drwxr-xr-x 1 root root    8 Dec 24 06:15 settings
drwxrwxrwx 1 root root    8 Dec 24 06:16 simultaneous
drwxr-xr-x 1 root root    8 Dec 24 06:15 statistics
drwxr-xr-x 1 root root   32 Dec 24 06:15 structure
drwxr-xr-x 1 root root    8 Dec 24 06:15 system
drwxr-xr-x 1 root root    8 Dec 24 06:15 uncached

Информация:
owfs - это программа, которая отображает сеть в виде файловой системы. То, что owfs совпадает с названием всего пакета - чистая случайность.
owhttpd - это программа, которая делает доступной сеть по HTTP протоколу (по-народному, через браузер)
И та и другая программы могу работать с мастером сети самостоятельно, но не вместе!
Чтобы owfs и owhttpd работали одновременно, нужно запустить owserver.
owserver -u -p 3000
Запускает сервер работы с сетью, -u значит физическое устройство USB типа DS9490R, и отвечает на запросы по 3000 порту.
owhttpd -s 3000 -p 3001
-s 3000 - порт, на котором запущено owserver
-p 3001 - порт, на котором owhttpd сам отвечает по протоколу HTTP
owfs -s 3000 /mnt/1wire/
-s 3000 понятно, дальше идет mount point, который является обязательным параметром

Пробуем зайти http://192.168.xx.xx:2121/

Добавим в /etc/modprobe.d/fbdev-blacklist.conf (чтобы не использовать модули ядра линукс, а брать из пакета owfs)
blacklist ds9490r
blacklist ds2490
blacklist wire


Редактируем файл /etc/owfs.conf
# Sample configuration file for the OWFS suite for Debian GNU/Linux.
# This is the main OWFS configuration file. You should read the
# owfs.conf(5) manual page in order to understand the options listed
# here.
######################## SOURCES ########################
# With this setup, any client (but owserver) uses owserver on the
# local machine...
! server: server = localhost:4304
# ...and owserver uses the real hardware, by default fake devices
# This part must be changed on real installation
#server: FAKE = DS18S20,DS2405
# USB device: DS9490
server: usb = all
# Serial port: DS9097
#server: device = /dev/ttyS1
# owserver tcp address
#server: server = 192.168.10.1:3131
# random simulated device
#server: FAKE = DS18S20,DS2405
######################### OWFS ##########################
mountpoint = /mnt/1wire
allow_other
####################### OWHTTPD #########################
http: port = 2121
####################### OWFTPD ##########################
ftp: port = 2120
####################### OWSERVER ########################
server: port = localhost:4304


Редактируем /etc/fuse.conf:
# Set the maximum number of FUSE mounts allowed to non-root users.
# The default is 1000.
#
#mount_max = 1000  

# Allow non-root users to specify the 'allow_other' or 'allow_root'
# mount options.
#

user_allow_other


После этого монтировать можно командой # owfs. Хотя в прицнипе монтирование нам особо и не нужно ибо есть tcp owserver, монтировать датчики в файловую систему удобно для тестов. Поэтому процесс автомонтирования при загрузке рассматривать не будем (примеры скрипта можно найти в сети) update. или здесь.

Создание сети 1-wire.

Небольшой ликбез по поводу сети 1-wire для новичков как я (после моего месячного изучения урывками). Если профи увидят ошибки, прошу комментировать. Итак, сеть 1-wire - сеть на одной шине, компоненты которой подключаются последовательно. Компонентами могут выступать как уже готовые микросхемы с датчиками и так и микросхемы управления вводом\выводом (то есть для подключения дополнительных цифровых или аналоговых датчиков). В сети 1-wire по умолчанию всего два контакта - data и земля. В data передаются данные (как видно по названию), а также т.н. паразитное питание. То есть можно использовать всего два провода. Вначале я не очень понимал это принцип, поэтому накупил штук 10 ds2401 которые как раз от него и работают - сегодня будем тестировать сеть на них. Так вот, строить сеть на паразитном питании (питание идет с контроллера DS9490R) можно, но не нужно. :) Для пары датчиков и короткой шине можно использовать паразитное питание, а вот если шина длиной более 30 метров и датчиков много - ожидается просадка по напряжению, поэтому умные люди придумали (по ссылке много интересного про 1wire) и используют отдельное питание 5V, но не простое, а канал с повышенным напряжением. По ссылке прекрасно все описано. Я лишь дополню зачем это надо - 12 V в каждом модуле преобразуется стабилизатором в 5V, а 18V в 12V. Это сделано для того, чтобы даже при просадке напряжения в шине на компоненты гарантировано поступало 5V и на некоторые датчики 12V. Далее, сразу используем витую пару 5ой категории, чтобы не переделывать потом. Для коммутации также используем телефонные (rj11\12) коннекторы и внешние телефонные розетки.
Ну вот в принципе и все.

Делаем первое устройство сети 1-wire.

Сейчас мы будем делать устройство с паразитным питанием, потому что пока у меня нет нужной микросхемы 1-wire с внешним питанием. Тырим одну картинку по ссылке выше:



Итак, используем так:
светло-зеленый:data (3ий пин в контроллере)
зеленый:земля(GRND) (4ый пин в контроллере)


Обжимаем два провода, остальные пока не нужны. Обжато не очень, в следующий раз наверное по другому обожму. Но для теста пойдет.


Подключать мы будем устройство, которое выдает уникальный id (например, если устройство с определенным id доступно - дверь закрыта, а если не доступно - значит дверь открыта) - ds2401. Нагло тырим еще одну картинку с форума.



Второй конец я впаял в макет плату. Распиновку ds2401 смотрим здесь.


Подключаем (геркон замкнут - вот эти две коричневые цилиндрические штуки и есть магнит с герконом):
/mnt/1wire# ls -l
total 0
drwxrwxrwx 1 root root  8 Dec 24 14:47 01.E890ED150000
drwxrwxrwx 1 root root  8 Dec 24 14:47 81.EE6F32000000
drwxr-xr-x 1 root root  8 Dec 24 10:12 bus.0
drwxr-xr-x 1 root root  8 Dec 24 10:12 settings
drwxr-xr-x 1 root root  8 Dec 24 10:12 statistics
drwxr-xr-x 1 root root 32 Dec 24 10:12 structure
drwxr-xr-x 1 root root  8 Dec 24 10:12 system
drwxr-xr-x 1 root root  8 Dec 24 10:12 uncached

/mnt/1wire/01.E890ED150000# cat type
DS2401

/mnt/1wire/01.E890ED150000# cat r_address
A9000015ED90E801

/mnt/1wire/01.E890ED150000# cat id
E890ED150000

Вот у нас и новый элемент сети 1-wire. r_address это и есть уникальный id ds2401, который по идее гарантирует уникальность микросхемы. Я брал в китайском интернет магазине, где-то слышал что они штампуют все под одну гребенку (надо будет поставить вторую ds2401 и проверить). Пробуем убрать магнит от геркона. Смотрим - элемент отсутствует. Вот вам и элементарная проверка на открытую дверь. Я пока не выбрал (может кто посоветует) систему, которая все эти данные собирает в базу, имеет веб-интерфейс и разные плюшки (например работа с tcp сервером 1-wire, jabber), пока в поиске. Но смысл понятен.
Обратите внимание, что появление датчика в сети 1wire может занять некоторое время (около 15 секунд, а может и больше).
ps. Почти все элементы покупались онлайн, могу поделиться ссылками.

22 декабря 2013 г.

Настройка Debian на Cubietruck (cubieboard 3)

В прошлом посте мы установили debian на nand память cubietruck. Итак, сеть не работает.

Проводная сеть.

modprobe sunxi_gmac

Это команда подгрузки модуля сетевого интерфейса в cubietruck. Она вызовет у нас ошибку вроде "could not open moddep file modules.dep.bin". А все потому что такого файла у нас нет и вообще каталога /lib/modules у нас нет. Решается просто - копируйте с SD карты с debian каталог /lib/modules, только проследите за тем, что у ядра у вас совпадают.

root@debtruck:~# mount /dev/mmcblk0p2  /mnt/mmc
root@debtruck:~# modprobe sunxi_gmac
root@debtruck:~# uname -a
Linux debtruck 3.4.61+ #1 SMP PREEMPT Sat Oct 26 13:08:57 CST 2013 armv7l GNU/Linux

После этого сетевой модуль подгрузится и будет работать.

Теперь есть интернет можно поставить еще один пакетик:
apt-get install bash-completion

Включение wifi

modprobe bcmdhd


А проще скопировать файл /mnt/mmc/etc/modules.conf c SD карты в NAND и перезаписать его. Тогда все необходимые модули будут грузиться автоматически. Еще можно скопировать каталог /lib/firmware.

Расширение дискового пространства

Так как изначально образ lubuntu сервера был где-то около 2 Гигабайт, а в NAND вроде нам обещали 8 Гигабайт, то имеет смысл расширить основной раздел. Перезагружаемся на SD карту (В принципе можно и работать прямо с nand, но мне не хотелось захламлять систему пока всякими git и make). Я испытываю проблемы с загрузкой с SD карты, похоже какой-то баг нерешенный. Но вроде приноровился вставлять карту при перезагрузке (см. предыдущий пост). Далее:
# apt-get install git
# git clone git://github.com/linux-sunxi/sunxi-tools
# cd sunxi-tools
# apt-get install libusb-1.0-0-dev make pkg-config
# make
# make install

Далее, запускаем скомпилированную программу nand-part и читаем, что пишут:
"Как видим мы хотим объединить 2 и 3 раздел в один, поэтому новая часть 2 радела is 4194304 + 10584064 = 14778368. "

# ./nand-part -f a20 /dev/nand 32768 'boot 131072' 'rootfs 14778368'

Перезагружаемся без SD карты.

# resize2fs /dev/nandb
# df -h
Filesystem      Size  Used Avail Use% Mounted on
rootfs          7.0G  866M  5.9G  13% /
Отлично, у нас 7 гигабайт!

Память

С памятью вроде проблем нет (dmesg):

Memory: 448MB 1536MB = 1984MB total

Светодиодная индикация

1 голубой включено
2 оранжевый cpu0 (загрузка)
3 белый cpu1 (загрузка)
4 зеленый mmc0 (обращение)


init.d Скрипт отключения/включения светодиодов в cubietruck:

#!/bin/bash
case "$1" in
    start)
        echo 0 > /sys/class/leds/orange:ph20:led2/brightness
        echo "Switching off Orange LED"
        echo 0 > /sys/class/leds/blue:ph21:led1/brightness
        echo "Switching off Blue LED" 
        echo 0 > /sys/class/leds/white:ph11:led3/brightness
        echo "Switching off White LED" 
        echo 0 > /sys/class/leds/green:ph07:led4/brightness
        echo "Switching off Green LED" 
    ;;
    stop)
        echo 1 > /sys/class/leds/orange:ph20:led2/brightness
        echo "Switching on Orange LED"
        echo 1 > /sys/class/leds/blue:ph21:led1/brightness
        echo "Switching on Blue LED" 
        echo 1 > /sys/class/leds/white:ph11:led3/brightness
        echo "Switching on White LED" 
        echo 1 > /sys/class/leds/green:ph07:led4/brightness
        echo "Switching on Green LED" 
     ;;
    *)
        echo "Usage: /etc/init.d/leds {start|stop}"
        exit 1
    ;;
esac


Правда после включения они не мигаю и горят просто. После перезагрузки будут мигать снова, и не буду мигать, если прописать автозагрузку скрипта.

19 декабря 2013 г.

Установка Debian на Cubietruck (cubieboard 3) на внутреннюю память (NAND)

Пришел мне cubietruck. На нем для тестов предустановлен android 4. Мне графика ни к чему, да и сервер на андроиде бестолковая затея. Выяснив, что на данный момент  Cubian толком не поддерживает Cubietruck пришлось выбирать из рекомендованного программного обеспечения. В итоге выбор пал на  Lubuntu Server (официальный сайт).

В процессе поиска, я наткнулся на порт debian для cubietruck для SD Card. Но он нам пригодится не для установки, а для работы с NAND. Можно взять Cubiuntu (пароль по умолчанию linaro\linaro).

1. Скачиваем образ по ссылкам.
2. Скачиваем Win32 Disk Imager  (делал под виной)
3. Вставляем sd карту или флешку, и пишем на нее образ. После старта, ищет загрузчик сначала на MicroSD карте, если не находит его, тогда на внутреннем накопителе, и в конце на USB флешке.

Пару команд на заметку:

locale-gen ru_RU.UTF8
dpkg-reconfigure locales


Устанавливаем lubuntu в nand  с помощью LiveSuitPack (или PhoenixSuit1.0.6.rar for Windows). Нажимаем кнопку FEL вставляем miniUSB в компьютер. Отпускаем FEL после включения. Для чего это надо? С этим образом загрузочные разделы, в которых я честно говоря пока не особо шарю, поэтому проще будет сделать так.

Далее, узнаем ip адрес устройства, заходим по ssh или подключаем клавиатуру.

Дальше у меня возникла проблема с этим портом для sd-карты.  Многие кубитраки идут с багой - невозможно загрузить  систему с SD карты. Испробовав разные комбинации обнаружил что если нажать ресет, а потом сразу вставить карту - система грузится! Потом нашел и другое решение - загрузить андроид с nand, и перезагрузится из него.

Попробуем скопировать другой загрузчик (собранный для lubuntu) в карту (не в раздел,а  прямо в устройство).

dd if=u-boot-sunxi-with-spl-ct-20131102.bin of=$card bs=1024 seek=8

В итоге в данном виде загрузка с SD карты у меня происходит без проблем.
Черт, вчера работало, сегодня нет, необъяснимо. :)

Форматируем после перезагрузки основной раздел, где лежит ОС (опять же загружаемся с sd карты пока).

mkfs.ext4 /dev/nandb


Раздел /dev/nanda трогать, как тут смысла я думаю нет. Плюс в /dev/nand уже тоже есть загрузочный сектор, который уже подготовлен.

Установка.

rootfs, устанавливаем стабильный debian.

apt-get update
apt-get install debootstrap
mount /dev/nandb /mnt/rootfs
debootstrap --verbose --arch armhf --variant=minbase --foreign stable /mnt/rootfs http://ftp.debian.org/debian
chroot /mnt/rootfs
/debootstrap/debootstrap --second-stage


cat <<END > /etc/apt/sources.list
deb http://ftp.debian.org/debian/ stable main contrib non-free
deb-src http://ftp.debian.org/debian/ stable main contrib non-free
deb http://ftp.debian.org/debian/ stable-updates main contrib non-free
deb-src http://ftp.debian.org/debian/ stable-updates main contrib non-free
deb http://security.debian.org/ stable/updates main contrib non-free
deb-src http://security.debian.org/ stable/updates main contrib non-free
END

apt-get update
export LANG=C
apt-get install apt-utils dialog locales
dpkg-reconfigure locales
# Выбираем en_US.UTF-8 или что сами хотите.
export LANG=en_US.UTF-8
apt-get install dhcp3-client udev netbase ifupdown iproute openssh-server iputils-ping wget net-tools ntpdate ntp vim nano less tzdata console-tools module-init-tools mc

cat <<END > /etc/network/interfaces
auto lo eth0
allow-hotplug eth0
iface lo inet loopback
iface eth0 inet dhcp
END

echo cubietruck > /etc/hostname
 
cat <<END > /etc/fstab
# /etc/fstab: static file system information.
#
#                
proc /proc proc defaults 0 0
/dev/nandb / ext4 noatime,errors=remount-ro 0 1
END

passwd
/etc/init.d/ntp stop

exit


Выключаем. Вытаскиваем SD карту. Включаем.  Должно работать, но сети у меня пока нет.  :) Исправлю - напишу.
Продолжение "настройка debian на cubietruck".
Еще пару экспериментов для памяти (которые мне не помогли):

под дескопной Виндой или Линуксом (од нашу АРМ систему не пойдет):
wget http://dl.cubieboard.org/software/a20-cubieboard/lubuntu/cb-a20-lubuntu-server-13.06-v1.00.img.gz
wget "http://forum.xda-developers.com/attachment.php?attachmentid=1740401&d=1361198061" -O "imgRePacker_204.zip"
gunzip cb-a20-lubuntu-server-13.06-v1.00.img.gz
unzip imgRePacker_204.zip
chmod 777 imgrepacker
./imgrepacker cb-a20-lubuntu-server-13.06-v1.00.img.gz

Заливаем через scp bootloader.fex

dd if=/usr/src/bootloader.fex of=/dev/nanda
это извлечение из nand образа загрузчика (какого-то уровня). imgrepacker отсюда.