пятница, 30 мая 2014 г.

Запуск RTC pcf2127 в Debian на Raspberry Pi.



Есть у "малиновой" платы один недостаток - нет у нее часов реального времени. Недостаток не фатальный и исправляется он покупкой и установкой маленькой платы с батарейкой, или большой платы, в которой уже есть этот чип и батарейка. У меня был второй вариант. Аппаратно всё просто, а программно не очень.

Главная проблема в том, что производитель этого чипа предоставляет свою сборку ядра и бинарный модуль только для одной старой версии ядра. Но есть и хорошие новости. С версии 3.12.20 модуль входит в состав ядра.

Итак, для начала обновим ядро с модулями и видео-драйверами:

$ sudo rpi-update

И перезагрузим систему:

$ sudo reboot

Теперь можно начинать колдовать.
Действовать будем по инструкции со странице, посвященной плате, на которой установлен чип pcf2127a. Он немного отличается от версии без буквы "a" в названии, но в целом совместим.

Сначала надо установить пакет "i2c-tools":

$ sudo apt-get update
$ sudo apt-get install i2c-tools


Теперь надо загрузить модуль ядра "i2c_bcm2708" для доступа в шине i2c:

$ sudo modprobe i2c_bcm2708

Проверим, что таймер на шине виден:

$ sudo i2cdetect 1

Вместо единицы надо подставить номер адаптера, к которому подключен таймер. Список всех адаптеров можно посмотреть командой

$ sudo i2cdetect -l

Она выдаст примерно такой список:

i2c-0   i2c       bcm2708_i2c.0                      I2C adapter
i2c-1   i2c       bcm2708_i2c.1                      I2C adapter


Вернемся к нашим баранам. Таймер обычно виден по адресу 0x51, о чем свидетельствует вывод i2cdetect:

WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n]
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- 51 -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --


Итак, таймер найден, теперь надо объяснить системе, что это часы реального времени. Для этого сначала загрузим модуль для работы с этим устройством:

$ sudo modprobe rtc_pcf2127

И дадим команду на идентификацию устройства по аресу 0x51 на шине №1 как pcf2127:

$ su -c "echo pcf2127 0x51 > /sys/class/i2c-adapter/i2c-1/new_device"


В выводе dmesg должно появится примерно следующее:

[   44.356516] rtc-pcf2127 1-0051: chip found, driver version 0.0.1
[   44.392866] rtc-pcf2127 1-0051: rtc core: registered rtc-pcf2127 as rtc0
[   44.410622] i2c i2c-1: new_device: Instantiated device pcf2127 at 0x51


Теперь попробуем прочитать время из таймера:

$ sudo hwclock
Птн 30 Май 2014 20:47:50  -0.148104 секунд

Если вместо ошибки программа выдала время, то всё отлично.

Теперь закрепим результат.

Сперва будем строить, а потом уже рушить.

Для загрузки нужных модулей при старте системы пропишем их в файл "/etc/modules" в таком порядке:

i2c-dev
i2c-bcm2708
rtc_pcf2127


Система работать с RTC на шине i2c самостоятельно не умеет, поэтому для синхронизации системных часов с таймером добавим в файл "/etc/rc.local" следующие команды:

echo pcf2127 0x51 > /sys/class/i2c-adapter/i2c-1/new_device
sleep 2
hwclock -s

Первая команда создаёт в системе новой устройство, вторая даёт задержку на его инициализацию, а третья синхронизирует системное время с RTC.

Теперь можно отключить или совсем удалить программу "fake-hwclock":

$ sudo update-rc.d fake-hwclock disable
$ sudo rm /etc/cron.hourly/fake-hwclock
$ sudo apt-get remove fake-hwclock


Чем больше команд, тем больше разрушений.

Теперь можно перезагрузить систему и проверить, что всё работает так, как задумано.

Инструкция составлена при помощи гугления, слез, мата и метода тыка.