Підключення символьного РКІ до плати від WD MyBook Live на AppliedMicro APM82181

Добрий день! Метою даної роботи було розширення можливостей наявної плати від NAS WesternDigital MyBook Live.

Зовнішній вигляд:image

За своїми характеристиками дана плата дуже не погана:

Процесор: APM82181
Частота: 800 МГц
Платформа: PowerPC 44x
ОЗУ: 256 MB
ПЗУ: 512 КВ
З інтерфейсів в наявності SATA, мережа 100 Мбіт/с, послідовний порт (UART, не розпаяний), місце під налагоджувальний роз'єм JTAG. На платі була етикетка з номером 4061-705086-003 REV. AH. На іншій стороні витравлений номер 4060-705086.

Зміст статті:

1. Підключення консолі
2. Завантаження без диска
3. Компіляція в LEDE
4. Управління портами (через LuCI і консоль)
5. Підключення до шини I2C
6. Підключення розширювач портів PCF8574

Інше в наступній частині…

Доповнення і зауваження вітаються. Поїхали!

1. Підключення консолі

Для роботи з платою потрібно локальне підключення консолі (хоча більшість операцій після завантаження можна виконувати і через SSH). Робиться це просто, в інтернеті достатньо інформації, наприклад WD MyBook Live UART Port.

Розпаювання контактів:image

Підключення робиться до порту RS232 комп'ютера через перехідник RS232-UART, т. к. на платі логічні рівні в межах 3.3 Ст. Швидкість за замовчуванням 115200 бод.

Після підключення і подачі живлення в консолі видно повідомлення завантажувача u-boot:
U-Boot 2009.08-svn65645 (Oct 08 2012 - 14:36:50), Build: 0.2.5

CPU: AMCC PowerPC UNKNOWN (PVR=12c41c83) at 800 MHz (PLB=200, OPB=100, EBC=100 MHz)
Bootstrap Option E - Boot ROM Location NOR/SRAM (8 bits)
32 kB I-Cache 32 kB D-Cache
Board: Apollo-3G - APM82181 Board, 2*SATA, 1*USB
I2C: ready
DRAM: Auto calibration 256 MB
FLASH: 512 kB
DTT: 1 INIT FAILED
Net: PHY EC1 Register: 0x2c8c
ppc_4xx_eth0

Type run flash_nfs to mount root filesystem over NFS

Hit any key to stop autoboot: 0


Повідомлення «Apollo-3G — APM82181 Board, 2*SATA, 1*USB» трохи невірне, так як USB тут немає, а SATA всього один. Це пов'язано мабуть що завантажувач загальний для MyBook Live і моделі DUO з двома дисками.

Якщо нічого не натискати в консолі, то буде зроблена спроба завантаження з жорсткого диска. В нашому випадку його немає, тому натисканням будь-якої кнопки завантаження зупинено.

2. Завантаження без диска

У завантажувачі u-boot багато можливостей для роботи з обладнанням.

Наприклад, можна подивитися всі кольори трикольорового світлодіода.Вимикання світлодіода (у завантажувачі горить синім кольором):
ledtestoff 

Тест трьох кольорів світлодіода по черзі:
ledtest


Список команд можна побачити набравши help. Детальніше про завантажувачі можна дізнатися тут. В консолі при завантаженні видно, що u-boot пропонує варіант монтування файлової системи nfs «Type run flash_nfs to mount root filesystem over NFS». В даному ж випадку ми будемо користуватися іншим варіантом — завантаженням RAM-образу c TFTP-сервера.

На комп'ютері піднімається сервер, наприклад TFTPD32 (Official site), потім налаштовуємо плату. Встановлюємо локальний IP адресу і адресу TFTP сервера (комп'ютера). Вони повинні бути з однієї підмережі:

setenv ipaddr '192.168.1.1'
setenv serverip '192.168.1.10'

Подивитися імена файлів, які будуть запитуватися з TFTP-сервера:

=> printenv fdt_file bootfile
fdt_file=apollo3g.dtb
bootfile=uImage

Зауважимо, що у змінній fdt_file записано ім'я файлу дерева пристроїв, а в bootfile — ім'я файлу образу RAM-диска з операційною системою.

Імена можна поміняти на більш зручні аналогічно адресами командою setenv. Після установки бажано зберегти нові значення змінних в ПЗУ:

=> saveenv
Saving Environment to Flash...
Un-Protected 1 sectors
Un-Protected 1 sectors
Erasing Flash...
. done
Erased 1 sectors
Writing to Flash... done
Protected 1 sectors
Protected 1 sectors

Таким чином після перезавантаження або вимикання живлення налаштування збережуться. Після цього розміщуємо два необхідних файлу (якщо у вас їх немає, то про їх створення дивіться у наступному розділі) на TFTP-сервері і набираємо команду run net_nfs.

=> run net_nfs
Waiting for PHY auto negotiation to complete.. done
ENET Speed is 100 Mbps - FULL duplex connection (EMAC0)
Using ppc_4xx_eth0 device
TFTP from server 192.168.1.10; our IP address is 192.168.1.1
Filename 'uImage'.
Load address: 0x1000000
Loading: #################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#
done
Bytes transferred = 6680079 (65ee0f hex)
Using ppc_4xx_eth0 device
TFTP from server 192.168.1.10; our IP address is 192.168.1.1
Filename 'apollo3g.dtb'.
Load address: 0x1800000
Loading: ##
done
Bytes transferred = 16384 (4000 hex)
## Booting kernel from Image at Legacy 01000000 ...
Image Name: POWERPC LEDE Linux-4.4.21
Image Type: PowerPC Linux Kernel Image (gzip compressed)
Data Size: 6680015 Bytes = 6.4 MB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
## Flattened Device Tree blob at 01800000
Booting using the fdt blob at 0x1800000
Uncompressing Kernel Image ... OK
Loading Device Tree to 00ff9000, end 00ffffff ... OK


Як видно, в результаті завантажуються два файлу. Вони розміщуються в заданих місцях оперативної пам'яті, ядро розпаковується і завантажується. В результаті маємо робочу систему, в даному випадку LEDE:

root@lede: uname -a
Linux lede 4.4.21 #0 Fri Nov 18 03:27:44 UTC 2016 ppc GNU/Linux

3. Компіляція в LEDE

В якості джерела операційної системи для нашої плати будемо використовувати LEDE. Це форк OpenWRT і він підтримує плату MyBook Live. Скачати можна тут: apm82181-lede. Докачиваем пакети, як написано в інструкції:

./scripts/feeds update -a 
./scripts/feeds install -a 

Запускаємо конфігуратор:

make конфігураційного меню

Вибираємо в якості системи («Target System») «AppliedMicro APM821xx», в якості підсистеми («Subtarget») — «Devices which boot from SATA (NAS)», профіль («Target Profile») — «Western Digital My Book Live». Кінцевим чином («Target Images») повинен обов'язково бути відзначений ramdisk.

Пакети вибираємо за своїм розсудом. Зберігши настройки в конфігураторі і вийшовши з нього, можна запустити компіляцію командою make.

Після закінчення процесу, якщо він пройшов без помилок, необхідні файли можна забрати і покласти на TFTP-сервер:

  • файл bin/targets/apm821xx/sata/lede-apm821xx-sata-MyBookLiveSingle-initramfs-kernel.bin перейменовуємо в uImage
  • файл build_dir/target-powerpc_464fp_musl-1.1.15/linux-apm821xx_sata/tmp/lede-apm821xx-sata-MyBookLiveSingle-initramfs-kernel.bin.dtb перейменовуємо в apollo3g.dtb
Таким чином ми пройшли етапи завантаження системи без диска.

4. Управління портами (через LuCI і консоль)

Знайти в інтернеті схему даної плати і взагалі схему будь-якого пристрою на базі процесора APM82181 мені не вдалося. Тому будемо виконувати частково реверс-інжиніринг (зворотний розробку), тобто здогадуватися про з'єднаннях на платі і перевіряти це. Розробники LEDE мабуть частково це зробили, тому що підключені порти можна побачити в дереві пристроїв або подивитися інформацію з ядра:

Порти вводу-виводу
root@lede: cat /sys/kernel/debug/gpio
GPIOs 496-503, platform/4e0100000.gpio1, 4e0100000.gpio1:
gpio-498 ( |Reset button ) in hi

GPIOs 504-511, platform/4e0000000.gpio0, 4e0000000.gpio0:
gpio-504 ( |enable EMAC PHY ) out hi
gpio-505 ( |Enable Reset Button,) out lo
gpio-506 ( |USB Power Core ) out hi
gpio-507 ( |Power Drive Port 1 ) out hi
gpio-508 ( |? ) out lo
gpio-509 ( |? ) out hi
gpio-510 ( |? ) out lo
gpio-511 ( |Power Drive Port 0 ) out hi


Як видно, один порт використовується для введення натискання кнопки, інші на висновок для управління. Зрозуміло, що редагуючи файл дерева пристроїв (файл з розширенням .dts) можна звільнити від функцій будь-порт в операційній системі, але це може позначитися на працездатності функціональних блоків плати. Хіба що крім світлодіода. Порти, підключені до цього індикатору, можна використовувати в своїх цілях. Порти позначені знаком питання, як раз до нього підключені. А управління світлодіодом доступно, наприклад, з консолі.

За замовчуванням після завантаження LEDE індикатор горить зеленим кольором. Ось так його можна вимкнути:

echo 0 > /sys/class/leds/mbl\:green\:power/brightness

І включити синій:

echo 1 > /sys/class/leds/mbl\:blue\:power/brightness

Якщо LEDE збиралася з веб-оболонкою LuCI, то світлодіодами можна управляти з браузера.

Заходимо по IP адресі мережевої платиimage

В меню System заходимо в LED Configuration, і налаштовуємо на які події спрацьовує кожен конкретний колір світлодіода. Наприклад ось так зелений світлодіод буде блимати на приходять і йдуть мережеві пакети:

Мережева активністьimage

Зрозуміло, що якщо використовувати порти світлодіода для своїх потреб, то сервіс, керуючий світлодіодом (/etc/init.d/led) буде не потрібен драйвер теж. А управління можна зробити з скрипта наприклад так:

echo 1 > /sys/class/gpio/gpio508/value

5. Підключення до шини I2C

Отже, є можливість використовувати як мінімум три порти. Хотілося б, звичайно, мати більше ресурсів. Можна поставити на ці порти розширювач портів, підключити його до програмного порту I2C. Тоді можна набрати практично необмежену кількість портів, щоправда з невисокою швидкодією.

На платі було деяку кількість порожніх місць, з'явилося бажання перевірити може на них щось розведено, що може стати нам у пригоді.

Наприклад поблизу процесора посадочне місце, маркированное U12 для чіпа з 8-ма ногами:

Припаяний шлейфimage

Переконавшись що на всіх контактах не більш 3.3, був підключений цифровий аналізатор.
В процесі завантаження ОС ніяких сигналів виявлено не було. Тоді в дерево пристроїв було додано опис шини I2C, оскільки спочатку вона була відсутня:

IIC0: i2c@ef600700 {
compatible = "ibm,iic";
reg = <0xef600700 0x00000014>;
interrupt-parent = <&UIC0>;
interrupts = <0x2 0x4>;
fast-mode;
#address-cells = <1>;
#size-cells = <0>;
};

Зрозуміло, що в конфігурації LEDE теж необхідно включити підтримку I2C в ядрі (kmod-i2c-core).

Після компіляції, оновлення файлу на сервері TFTP і перезавантаження з'явилося пристрій /dev/i2c-0.

root@lede: dmesg | grep i2c
[ 4.816060] i2c /dev entries driver
[ 4.819878] ibm-iic 4ef600700.i2c: using standard (100 кгц) mode

Відправляючи символи командою echo:

root@lede: echo 11 > /dev/i2c-0
ash: write error: Remote I/O error

Був виявлений сигнал цифровим аналізатором:image

Таким чином виявлена апаратна шина I2C, що сильно розширило можливості вводу-виводу даної плати.

Судячи по розташуванню сигналів на U12 (5 — GND, 7 — SDA, 8 — SCL), це можливо передбачався ADM1032ARMZ — датчик температури.

6. Підключення розширювач портів PCF8574

Прийшов час підключити що-небудь на шину I2C. У запасах знайшовся рідкокристалічний індикатор розмірністю 2х16 знакомісць, кожне 8х5 пікселів. Зроблено в Китаї на основі клону контролера HD44780 і розширювач портів PCF8574.

РКІ HD44780 16x2 I2Cimage
За описом допускає харчування та рівні сигналів як 5, так і 3.3, але при перевірці було виявлено дуже низька контрастність зображення при живленні 3.3 Ст. Так як живлення 5В призвело б і до рівнів сигналів від 0 до 5 В, а плата розрахована на 3.3, то довелося зробити примітивний перетворювач рівнів сигналів. Шина I2C двонаправлена, від пристрою повинен приходити сигнал підтвердження, тому як мінімум на лінії SDA повинен бути двонаправлений конвертер. Дуже добре варіанти схем описані тут: Узгодження логічних рівнів 5В і 3.3 пристроїв. У нашому випадку була використана

схема з польовим транзистором з ізольованим затвором,image

Правда транзистор інший, підібраний з аналогічних — BSS123.

Зібраний на макетної платі:image
Таким чином, на РІДКОКРИСТАЛІЧНИЙ індикатор подано живлення 5В (взято на платі з роз'єму живлення SATA), на перетворювач рівня приходять обидва харчування — 3.3 і 5В.

Тепер додамо в LEDE розширювач портів. Включаємо підтримку в ядрі (Kernel modules — Other modules — kmod-gpio-pcf857x… PCX857x, PCA967x and MAX732X I2C GPIO expanders), перекомпилируем, заливаємо на сервер, перезавантажуємося.

Дивимося наявність драйвера:

root@lede: lsmod |grep pcf
gpio_pcf857x 6128 0

Підключаємо (0x27 — адресу нашого розширювача на шині I2C):

root@lede: echo pcf8574 0x27 > /sys/bus/i2/devices/i2c-0/new_device
[ 218.957888] pcf857x 0-0027: probed
[ 218.961321] i2c i2c-0: new_device: Instantiated device pcf8574 at 0x27

Перевіряємо поява портів:

root@lede: ls -l /sys/class/gpio/
--w------- 1 root root 4096 Jan 1 1970 export
lrwxrwxrwx 1 root root 0 25 Nov 04:04 gpiochip488 -> ../../devices/platform/plb/plb:opb/4ef600700.i2c/i2c-0/0-0027/gpio/gpiochip488
lrwxrwxrwx 1 root root 0 Jan 1 1970 gpiochip496 -> ../../devices_platform/plb/plb:opb/4e0100000.gpio1/gpio/gpiochip496
lrwxrwxrwx 1 root root 0 Jan 1 1970 gpiochip504 -> ../../devices/platform/plb/plb:opb/4e0000000.gpio0/gpio/gpiochip504
--w------- 1 root root 4096 Jan 1 1970 unexport

Як видно, з'явилася група портів gpiochip488 на шині I2C з адресою 0x27. Зараз можна додати порти, які будуть також представлені системою, як і розташовані на процесорі, незважаючи на те, що вони працюють через розширювач портів:

root@lede: echo 488 > /sys/class/gpio/export
root@lede: echo 489 > /sys/class/gpio/export
root@lede: echo 490 > /sys/class/gpio/export
root@lede: echo 491 > /sys/class/gpio/export

… і так до 495, так як у нас 8-портовий розширювач в наявності. Перевіримо їх наявність:

root@lede: ls -l /sys/class/gpio/gpio???
lrwxrwxrwx 1 root root 0 25 Nov 04:17 /sys/class/gpio/gpio488 -> ../../devices/platform/plb/plb:opb/4ef600700.i2c/i2c-0/0-0027/gpio/gpio488
lrwxrwxrwx 1 root root 0 25 Nov 04:17 /sys/class/gpio/gpio489 -> ../../devices/platform/plb/plb:opb/4ef600700.i2c/i2c-0/0-0027/gpio/gpio489
lrwxrwxrwx 1 root root 0 25 Nov 04:17 /sys/class/gpio/gpio490 -> ../../devices/platform/plb/plb:opb/4ef600700.i2c/i2c-0/0-0027/gpio/gpio490
lrwxrwxrwx 1 root root 0 25 Nov 04:17 /sys/class/gpio/gpio491 -> ../../devices/platform/plb/plb:opb/4ef600700.i2c/i2c-0/0-0027/gpio/gpio491

Задамо напрямок роботи на висновок:

root@lede: echo out > /sys/class/gpio/gpio488/direction
root@lede: echo out > /sys/class/gpio/gpio489/direction
root@lede: echo out > /sys/class/gpio/gpio490/direction
root@lede: echo out > /sys/class/gpio/gpio491/direction

Якщо треба ввести, то треба дати команду «in». Ну і перевірити як працює висновок, наприклад вимірюючи стан виходу тестером або цифровим аналізатором. У разі підключеного до расширителю РКІ HD447880 можна скористатися тим, що третій біт розширювача керує підсвічуванням індикатора:

root@lede: echo 1 > /sys/class/gpio/gpio491/value
root@lede: echo 0 > /sys/class/gpio/gpio491/value

Перша команда вмикає підсвічування, друга її вимикає. Щоб пристрою додавалися в процесі завантаження можна включити їх в дерево пристроїв:

IIC0: i2c@ef600700 {
compatible = "ibm,iic";
reg = <0xef600700 0x00000014>;
interrupt-parent = <&UIC0>;
interrupts = <0x2 0x4>;
fast-mode;
#address-cells = <1>;
#size-cells = <0>;
/* Boot ROM is at 0x52-0x53, do not touch */
/* Unknown chip at 0x6e, not sure what it is */
i2cled: led@27{
#gpio-cells = <2>;
compatible = "nxp,pcf8574";
reg = <0x27>;
gpio-controller;
};
};

Рядки після мітки i2cled замінюють команду «echo pcf8574 0x27 > /sys/bus/i2/devices/i2c-0/new_device».

Отже, з'явилася і реалізовано на практиці можливість прозоро використовувати порти вводу-виводу, підключені через розширювач до шині I2C.

Для першої частини, напевно, достатньо. У другій частині, якщо звичайно не буде явного антагонізму в коментарях, дійдемо до використання індикатора для відображення стану системи:

image

Для цього був використаний і доопрацьований драйвер HD44780. Підключений пакет LCD4Linux, в якому також був написаний новий драйвер дисплея, керуючий дисплеєм командами терміналу VT100, тому що існуючі драйвери не підійшли.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.