Eny Technology Co., Ltd. является надежным производителем и экспортером телевизионных приставок, терминалов тонких клиентов, а также Cloud Terminal-ов. Продукты компании Eny Technology, имеют хорошую репутацию на мировом рынке. Для того, чтобы поставлять качественные продукты и сервис, компания получила необходимые разрешения и сертификаты CE, а также UL сертификаты.

Hardware Features

Enybox X2 это миниатюрный TV Box, выполненный в алюминиевом корпусе, и работающий на SoC Amlogic S912 включающий восьми-ядерный процессор ARM® Cortex™-A53 и 3D ускоритель ARM® Mali™-T820MP3. Благодаря тому, что компания Amlogic открыла исходные коды и организовала техническую поддержку разработчиков открытых программных продуктов на сайте openlinux.amlogic.com, данный TV Box можно рассматривать не только как законченное устройство, но и как платформу для разработки собственных решений.

Enybox X2
  • Amlogic S912: 2.0 GHz 64Bit Octa-Core ARM® Cortex™-A53 CPU, 750MHz+ ARM® Mali™-T820MP3 GPU
  • 2GB DDR3/DDR4 + 8GB/16GB/32GB EMMC-V5.0
  • Broadcom AP6255 Wifi + Bluetooth Module
  • HDMI 2.0a with 4Kx2K@60 max resolution output
  • 2 High speed USB 2.0,support U DISK and USB HDD
  • Card reader: SD/SDHC/MMC
  • Ethernet: IEEE 802.3 10/100M
  • Video: CVBS 480i/576i output, RGB888 TTL interface up to 1920×1080
  • Audio: SPDIF/IEC958 output, PCM input/output
  • Tiny form factor: 118x118x25 mm

Enybox X2 поддерживает операционные системы на базе ядра Linux (поставки Ubuntu, Buildroot) и Android.

Toolchains

Для Enybox X2 мы приготовили четыре toolchain-а.

Первый предназначен для создания ПО на архитектуру AArch64, причем сам toolchain работает на x86_64 Linux машинах. Получить его можно на нашем FTP-сервере в каталоге toolchains/x86_64. Выбирать здесь нужно последнюю версию архива с именем 'aarch64-S9XX-linux-glibc-*.tar.gz'.

Второй toolchain предназначен для создания систем, способных работать на 64-битных ARM процессорах, но использующих лишь 32-битные наборы команд. Данный toolchain находится в архиве с именем 'arm8l-A9XX-linux-glibc-*.tar.gz'.

Третий toolchain предназначен для сборки firmware в составе U-Boot и готовит программы под архитектуру ARM® Cortex™-A3, причем без использования GNU Libc. Этот toolchain расположен в каталоге toolchains/x86_64 под именем 'arm-A9XX-eabi-newlib-*.tar.gz'.

И, наконец, четвертый toolchain построен для создания целевых программ низкого уровня, не использующих библиотеку GNU Libc. Данный toolchain можно использовать, например, при создании собственного загрузчика или для сборки U-Boot. Этот toolchain расположен в каталоге toolchains/x86_64 под именем 'aarch64-S9XX-elf-newlib-*.tar.gz'.

Для самостоятельной сборки toolchain-а, необходимо получить ветку toolchains-1.1.x репозитория toolchains, например, следующим образом

$ svn co
  svn://radix.pro/toolchains/branches/toolchains-1.1.x
  toolchains

И выполнить команду make в соответствующем каталоге:

$ cd toolchains/products/S9XX-glibc/1.1.2
$ make -j8

Напомним здесь, что перед сборкой необходимо подготовить каталог для инсталляции toolchain-а так, как это описано в разделе, посвященном загрузке toolchain-ов с нашего FTP-сервера.

Source Code

Компания Amlogic Co, Inc., которая является разработчиком SoC S912, распространяет исходные коды на собственном FTP-сервере. Здесь представлены не только коды ядра и загрузчика, а так же все необходимые драйверы устройств, которые обычно представлены на платах базирующихся на SoCs серии S8xx, S9xx.

На нашем FTP-сервере мы поддерживаем зеркало ключевых поставок исходных кодов от компании Amlogic. Кроме того, в каталоге 3pp/Amlogic можно найти отдельные архивы ядра Linux и загрузчика U-Boot, котые используются для сборки платформы Radix.Linux.

Flash Layout

Составить наиболее полное представление о размещении всех компонентов системы, как на загрузочной SD карте, так и во внутренней памяти устройства (eMMC), легче всего на примере инсталляции системы Radix.Linux.

SD Card

Загрузчик, предназначенный для SD карты, записывается в два этапа. Сначала записываются первые 442 байта информации по нулевому смещению от начала карты, затем оставшиеся байты загрузчика, начиная с 512-го, записываются со смещением 512 байтов от начала SD карты. Делается это для того, чтобы не повредить таблицу разделов диска. Всю процедуру записи загрузчика на SD карту можно представить следующими командами:

# dd if=u-boot.sd.bin of=/dev/mmcblk0  bs=1   count=442
# dd if=u-boot.sd.bin of=/dev/mmcblk0  bs=512 skip=1 seek=1

Пользователям системы Radix.Linux нет необходимости самостоятельно заботиться о порядке размещения данных на SD карте. Как мы говорили в разделе Products Release вводной статьи, для записи загрузочного образа достаточно загрузить свежие файлы с FTP сервера, например, из каталога 1.1.633/s9xx-glibc/enybox-x2 и выполнить две следующие операции:

# cat enybox-x2.boot-records enybox-x2.ext4fs > SDHC.img 
# dd if=SDHC.img of=/dev/mmcblk0

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

Следует отметить, что использование утилиты fdisk совершенно безопасно для загрузчика, который размещен на карте до начала разделов и не затрагивает таблицу разделов в MBR.


Прежде чем приступать к инсталляции системы Radix.Linux во встроенную eMMC память, необходимо очистить eMMC flash. Дело в том, что Enybox X2 поставляются с предустановленной системой Android и, при неудачной попытке загрузить ядро, расположенное на SD карте, с помощью стандартного загрузчика, произойдет запуск Android, который разрушит все данные на карте.

Если же eMMC память пуста, то процессор начнет загрузку с SD карты, разумеется, если обнаружит на ней необходимые для этого данные.

Итак, подключившись к плате через серийный порт и остановив загрузку с помощью клавиш <Space>, <Enter> или комбинации <Ctrl>+<C>, мы попадаем в консоль загрузчика.

Для очистки eMMC памяти достаточно выполнить команду store init 3, которая выдаст примерно следующий результат:

gxm_q201_v1# store init 3
emmc/sd response timeout, cmd8, status=0x3ff2800
emmc/sd response timeout, cmd55, status=0x3ff2800
[mmc_startup] mmc refix success
[mmc_init] mmc init success
switch to partitions #0, OK
mmc1(part 0) is current device
Device: SDIO Port C
Manufacturer ID: 15
OEM: 100
Name: AGND3 
Tran Speed: 52000000
Rd Block Len: 512
MMC version 5.0
High Capacity: Yes
Capacity: 14.6 GiB
mmc clock: 40000000
Bus Width: 8-bit DDR
[store]amlmmc erase 1emmckey_is_protected : protect
 start = 0,end = 57343


Caution! Your devices Erase group is 0x400
The erase range would be change to 0x36000~0x1d1efff

start = 221184,end = 30535678
gxm_q201_v1#

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

В случае успешной загрузки системы Radix.Linux, пользователь получит приглашение:

 . . .

Radix Linux 3.14.29 for Enybox X2 S912 release 1.1 [ tty1 ]

enybox-x2 login:

Изначально пароль суперпользователя не задан и войти в систему можно просто указав имя root,

Radix Linux 3.14.29 for Enybox X2 S912 release 1.1 [ tty1 ]

enybox-x2 login: root
Last login: Thu Jan  1 00:01:49 UTC 2015 on ttyS0
Linux 3.14.29.

root@enybox-x2:~#

однако, после первого входа в систему, следует установить пароль пользователя root.

eMMC Flash

Убедившись в том, что сделанные нами записи на SD карте исправны и система загружается нормально, можно приступать к инсталляции Radix.Linux.

Перезагрузив систему с помощью команды reboot, необходимо войти в консоль загрузчика (клавиши <Space>, <Enter> или комбинация <Ctrl>+<C>) и последовательно выполнить следующие операции.

Инициализировав mmc интерфейс с помошью команды mmcinfo:

gxm_q201_v1# mmcinfo
Device: SDIO Port B
Manufacturer ID: 41
OEM: 3432
Name: SD16G
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 14.5 GiB
mmc clock: 40000000
Bus Width: 4-bit

и загрузив параметры ядра из каталога /boot файловой системы, находящейся на SD карте:

gxm_q201_v1# ext4load mmc 0:1 0x01080000 /boot/x2.dtb
36927 bytes read in 49 ms (735.4 KiB/s)

записываем новую таблицу разделов:

gxm_q201_v1# store dtb write 0x01080000
[store]To run cmd[emmc dtb_write 0x01080000 0x40000]
write emmc dtb
mmc read lba=0x14000, blocks=0x400
start dts,buffer=0000000073eeb850,dt_addr=0000000073eeb850
parts: 2
00:      logo   0000000002000000 1
01:    rootfs   ffffffffffffffff 4
get_dtb_struct: Get emmc dtb OK!
Partition table get from SPL is :
        name

           offset
              size
              flag
===================================================================================
   0: bootloader
             0
            200000
                 0
   1: reserved
         400000
           4000000
                 0
   2: env
            4400000
            400000
                 0
   3: logo
           4800000
           2000000
                 1
   4: rootfs
         6800000
         1cb800000
                 4
mmc read lba=0x2000, blocks=0x2
mmc read lba=0x2002, blocks=0x2
mmc_read_partition_tbl: mmc read partition ERROR!
mmc write lba=0x2000, blocks=0x2
mmc write lba=0x2002, blocks=0x2
mmc_write_partition_tbl: mmc write partition OK!
  partition table success

Таблица записывается в начало раздела reserved и используется в дальнейшем не только загрузчиком, но и ядром Linux для обеспечения доступа к файловым системам на пользовательском уровне.


Здесь следует дать некоторые пояснения.

Дело в том, что разделы bootloader, reserved и env жестко определены в исходном коде загрузчика, а именно, в файле include/emmc_partitions.h:

#ifndef CONFIG_AML_MMC_INHERENT_PART
#define     PARTITION_RESERVED              (0)         /* size reserver after each partition */
#define     MMC_BOOT_PARTITION_RESERVED     (0x2*SZ_1M) /* size reserved after 'bootloader' partition */

#define     MMC_BOOT_NAME                   "bootloader"
#define     MMC_BOOT_DEVICE_SIZE            (0x2*SZ_1M) /* currently U-Boot size is approximately 920K */

#define     MMC_RESERVED_NAME               "reserved"
#define     MMC_RESERVED_SIZE               (64*SZ_1M)
#define     MMC_BOTTOM_RSV_SIZE             (0)
#endif      /* CONFIG_AML_MMC_INHERENT_PART */

// #define     MMC_CACHE_NAME                  "cache"
// #define     MMC_CACHE_SIZE                  (512*SZ_1M) // this is not used and should be get from spl

#define     MMC_ENV_NAME                    "env"
#define     MMC_ENV_SIZE                    (0x4*SZ_1M)

Кроме того, в исходном коде ядра (файл include/linux/mmc/emmc_partitions.h):

/* MMC Partition Table */
#define     MMC_PARTITIONS_MAGIC            "MPT"
#define     MMC_RESERVED_NAME               "reserved"

#define     SZ_1M                           0x00100000

/* the size of bootloader partition */
#define     MMC_BOOT_PARTITION_SIZE         (2*SZ_1M)

/* the size of reserve space behind bootloader partition */
#define     MMC_BOOT_PARTITION_RESERVED     (2*SZ_1M)

заданы переменные MMC_BOOT_PARTITION_SIZE и MMC_BOOT_PARTITION_RESERVED, с помощью которых процедура инициализации ядра определяет адрес раздела reserved, где находится таблица разделов eMMC памяти.

Адреса остальных разделов, а именно разделов logo и rootfs, определяются в файле x2.dts и читаются подсистемой команд загрузчика store во время записи параметров ядра (x2.dtb) и формировании таблицы разделов.


Итак, с помощью команды:

gxm_q201_v1# store dtb write 0x01080000

мы сформировали таблицу разделов eMMC.

Следующим шагом будет запись в раздел bootloader загрузчика, предназначенного специально для eMMC. Данный загрузчик находится в файле u-boot.bin и должен быть записан с нулевым смещением от начала eMMC памяти:

gxm_q201_v1# ext4load mmc 0:1 0x01080000 /boot/u-boot.bin
901120 bytes read in 104 ms (8.3 MiB/s)

gxm_q201_v1# store rom_write 0x01080000 0 100000
mmc switch to boot0 success
mmc switch to boot1 success
mmc switch to user success

gxm_q201_v1#

Далее необходимо записать переменные окружения U-Boot в раздел env:

gxm_q201_v1# defenv
## defenv_reserve

gxm_q201_v1# saveenv
Saving Environment to aml-storage...
mmc env offset: 0x4400000
Writing to MMC(1)... done

gxm_q201_v1#

На этом этапе, все действия, которые должны были быть произведены средствами загрузчика, выполнены. Однако для того, чтобы мы могли загружать устройство, нам необходимо установить непосредственно систему Radix.Linux, а также дать дополнительную информацию загрузчику и ядру Linux о том, на каком именно разделе eMMC следует искать корневую файловую систему.


Как ни странно, но для того, чтобы загрузчик мог читать файлы из корневой файловой системы, расположенной в разделе rootfs, необходимо создать классическую таблицу разделов в области MBR.

Для создания такой записи нам необходимо еще раз загрузить систему с SD карты и воспользоваться утилитой fdisk.

Проще всего, создание записи в таблице разделов, можно выполнить с помощью следующего скрипта, который подает необходимые команды на вход утилиты fdisk:

#!/bin/sh

fdisk /dev/mmcblk1 <<EOF
n
p
1
212992

a
p
w
EOF

Здесь число 212992 определяет начальный сектор, занимаемый корневой файловой системой и, поскольку размер сектора равен 512 байтов, данное число может быть получено путем деления смещения раздела rootfs от начала eMMC, заданного в байтах, на размер сектора диска:

212992 =
0x6800000 /
512;

Для того, чтобы упростить действия пользователей по созданию записи о разделе для корневой файловой системы в области MBR, в пакете u-boot поставляется файл /boot/rootfs-partition, который содержит необходимые команды для утилиты fdisk.


Итак, загрузив систему с SD карты,

Radix Linux 3.14.29 for Enybox X2 S912 release 1.1 [ tty1 ]

enybox-x2 login: root
Last login: Thu Jan  1 00:01:49 UTC 2015 on ttyS0
Linux 3.14.29.

root@enybox-x2:~#

необходимо записать информацию в таблицу разделов MBR с помощью команды:

root@enybox-x2:~# sh /boot/rootfs-partition

создать непосредственно Ext4 файловую систему:

root@enybox-x2:~# mke2fs -t ext4 -L rootfs /dev/mmcblk1p1

и переписать на нее содержимое образа enybox-x2.ext4fs.

Здесь важно подчеркнуть, что копирование файлов следует осуществлять от имени суперпользователя с сохранением всех аттрибутов файлов.

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

  • Если подключена SD карта и в корневой файловой системе /dev/mmcblk0p1 присутствует скрипт /boot/boot.sd.scr, то загрузчик следует инструкциям, записанным в данном скрипте. Если же файл /boot/boot.sd.scr не будет найден, то загрузчик попытается выполнить стандартную процедуру, предусмотренную для Enybox X2.
  • Если SD карта не подключена, то загрузчик попытается выполнить скрипт /boot/boot.scr, который предполагается найти в корневой файловой системе, расположенной в разделе /dev/mmcblk1p1, то есть в разделе rootfs eMMC.

В заключение важно подчеркнуть, что во время инициализации системы, ядро Linux перечитает таблицу разделов, расположенную в области reserved и раздел, известный ранее как /dev/mmcblk1p1, будет переименован в /dev/rootfs. Кроме того, все известные разделы eMMC, в файловой системе /dev, будут представлены по именам:

/dev/bootloader
/dev/reserved
/dev/env
/dev/logo
/dev/rootfs

Наверное это удобно для доступа к разделам во время работы системы.


Мы рассмотрели процесс ручной инсталляции системы Radix.Linux для того, чтобы наиболее полным образом составить представление об организации памяти. В дальнейшем значения размеров и смещений отдельных разделов дискового пространства могут быть изменены, однако, основной смысл представленного материала останется прежним.


Wireless

На плате Enybox X2 установлен WiFi модуль AP6255 и, для того чтобы драйвер мог загрузить firmware, символическая ссылка nvram.txt, находящаяся в каталоге /lib/firmware/broadcom/ap6xxx, должна указывать на файл nvram_ap6255.txt:

# cd /lib/firmware/broadcom/ap6xxx
# ln -sf nvram_ap6255.txt nvram.txt

Файл /etc/wpa_supplicant.conf, после установки системы Radix.Linux, содержит следующие данные.

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=root

update_config=1
eapol_version=1
ap_scan=1
fast_reauth=1
pmf=1

disable_scan_offload=1
wowlan_triggers=any
p2p_no_go_freq=5170-5740
p2p_search_delay=0
no_ctrl_interface=

ctrl_interface=wlan0
p2p_go_intent=13

Прежде чем использовать wpa_supplicant для соединения необходимо добавить существующие сети, например:

network={
   scan_ssid=0
   proto=WPA
   key_mgmt=WPA-PSK
   pairwise=CCMP TKIP
   group=CCMP TKIP WEP104 WEP40
}

network={
   ssid="your_id"
   psk=YOUR_HEX_KEY
}

Здесь your_id является именем сети, а YOUR_HEX_KEY – представляет собой шестнадцатеричный пароль для сети, использующей WPA-PSK/WPA2-PSK шифрование.

Создать шеснадцатеричный ключ для сети можно с помощью утилиты wpa_passphrase:

# wpa_passphrase your_id passphrase

network={
   ssid="your_id"
   #psk="passphrase"
   psk=59e0d07fa4c7741797a4e394f38a5c321e3bed51d54ad5fcbd3f84bc7415d73d
}

Где passphrase представляет собой текстовый пароль для сети your_id.

После создания необходимых записей в файле /etc/wpa_supplicant.conf подключение к беспроводной сети можно осуществить с помошью дух простых комманд:

# /usr/sbin/wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf
# dhcpcd wlan0

В заключение необходимо сказать, что компания Eny Technology Co., Ltd. уделяет большое внимание поддержке пользователей и организует как OEM, так и ODM поставки различных устройств на базе процессоров Amlogic и RockChip.