http://habrahabr.ru/post/217893/
Читая новости о запрете на поставку электронной компонентной базы из США для отдельных производителей в РФ, мы решили рассказать об одноплатном микрокомпьютере Module МВ 77.07, который был разработан в российском научно-техническом центре «Модуль» на базе одного из наиболее производительных российских процессоров архитектуры ARM. Также мы рассмотрим установку Linux-дистрибутива Debian на этот микрокомпьютер.
МВ 77.07 построен на базе системы на кристалле К1879ХБ1Я, которая также является разработкой НТЦ «Модуль». И хотя схема К1879ХБ1Я, в первую очередь, предназначена для использования в качестве декодера видеосигнала в различных ТВ-приставках, устройствах для видеонаблюдения и системах «умного дома», сам микрокомпьютер МВ 77.07 с этим процессором на борту позиционируется в том числе как система для энтузиастов-программистов и учебная плата для студентов. Таким образом, можно сказать, что это русский аналог Raspberry Pi. Давайте кратко разберем основные характеристики процессора К1879ХБ1Я, а затем — и самой платы.
Система на кристалле К1879ХБ1Я построена на основе двух процессорных ядер — ARM11 (ARM1176JZF-S ) и дополнительного DSP-процессора оригинальной архитектуры NeuroMatrix, который входит в блок декодирования аудиосигналов.
Рабочая частота ARM-процессора — 324 МГц (и DSP — тоже), не самая большая по современным меркам, однако мы смогли убедиться на собственном опыте, что она позволяет комфортно запускать ОС Linux и пользоваться достаточно богатой периферией процессора: аппаратными видеодекодерами H.264, MPEG-2, VC-1; 2D-видеоускорителем; 8-канальным аудиопроцессором на основе DSP; блоком демультиплексирования TS-потока; криптопроцессором с поддержкой алгоритмов AES и 3DES.
К1879ХБ1Я оснащен следующими интерфейсами:
- DDR2 SDRAM,
- NAND и SPI Flash,
- хостом HS USB 2.0,
- 10M/100M Ethernet,
- HDMI 1.2,
- I2S,
- S/PDIF,
- UART,
- SPI,
- I2C,
- JTAG,
- TS,
- GPIO.
Функциональная схема SoC К1879ХБ1Я
Перейдем к описанию самой платы МВ 77.07: её размер — 80x80 мм, помимо самого процессора на плате установлено 128 МБ системной памяти и 128 МБ видеопамяти (обе — DDR2-667 SDRAM), а также 1 ГБ NAND-памяти. Плата имеет следующие разъемы интерфейсов:
- 10М/100М Ethernet,
- два порта USB 2.0,
- HDMI 1.2.
Кроме этого, на «гребенки» по бокам выведены следующие интерфейсы:
- I2S,
- SPI Flash,
- TS (интерфейс транспортного потока),
- 8 GPIO,
- на отдельных разъемах UART, JTAG и два USB-порта.
Питание платы — 5 В, оценочная стоимость — в пределах 30 долларов.
В настоящее время для платы портированы загрузчик U-Boot и ядро Linux 2.6.33, разработаны драйвера для всех периферийных устройств, также сейчас завершается процесс портирования драйверов для Linux 3.10. Разработан ряд элементов конвейера gstreamer с поддержкой различных периферийных устройств (в частности, видеодекодера и видеоконтроллера). Для разработки под DSP-процессор существует NeuroMatrix SDK. Исходные коды U-Boot, Linux, а также сборочной системы Buildroot можно получить по запросу у НТЦ «Модуль».
1. Разворачиваем базовую Debian-систему
Для разворачивания корневой файловой системы Debian воспользуемся утилитой debootstrap, которая «признана официальным способом установки базовой системы Debian» (см. инструкцию на debian.org и wiki.debian.org).
Разворачивание целевой файловой системы с помощью debootstrap проходит в две стадии: первая выполняется в окружении хост-системы (на этой стадии скачиваются и распаковываются необходимые пакеты, но не устанавливаются); вторая стадии выполняется на целевой системе (здесь происходит конфигурация и установка пакетов).
Будем устанавливать Debian 7.0 Wheezy для архитектуры armel, система будет развернута в директории debrootfs.
Первая стадия debootstrap выполняется командой
sudo debootstrap --verbose --foreign --arch=armel wheezy debrootfs ftp://ftp.ru.debian.org/debian
Для выполнения второй стадии нам понадобится эмулятор QEMU в режиме syscall, его можно установить командой
sudo apt-get install qemu qemu-user-static
Затем надо скопировать qemu-arm-static с хост-системы на целевую систему:
sudo cp /usr/bin/qemu-arm-static debrootfs/usr/bin
После этого можно выполнить вторую стадию debootstrap:
sudo chroot debrootfs /debootstrap/debootstrap --second-stage
Далее можно удалить директорию debrootfs/debootstrap, которая нам больше не нужна.
2. Настраиваем Debian
Зададим пароль root-a и смонтируем виртуальные файловые систему на целевую систему:
sudo chroot debrootfs /usr/bin/passwd root
sudo mount -t proc none debrootfs/proc
sudo mount -t sysfs none debrootfs/sys
sudo mount -t devpts none debrootfs/dev/pts
Теперь можно chroot-ся в целевую систему:
sudo chroot debrootfs
Необходимо добавить список источников пакетов в etc/apt/sources.list (изначально он пустой):
deb http://ftp.ru.debian.org/debian/ wheezy main contrib non-free
deb http://http.ru.debian.org/debian wheezy main contrib non-free
И обновить индекс пакетов командой
apt-get update
После этого можно начать устанавливать нужные пакеты, например ssh-сервер и клиент:
apt-get install openssh-server openssh-client
Завершить работу с целевой системой можно командой
exit
После этого необходимо размонтировать виртуальные файловые системы, которые были смонтированные ранее:
sudo umount rootfs-dir/proc
sudo umount rootfs-dir/sys
sudo umount rootfs-dir/dev/pts
Также нужно скопировать модули ядра, с которым будет использоваться целевая rootfs, в директорию debrootfs/lib/modules.
Для возможности логинится на COM-порт, раскомментируйте строку в файле debrootfs/etc/inittab:
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
И установите нужную скорость, например, 38400:
T0:23:respawn:/sbin/getty -L ttyS0 38400 vt100
После этого можно создать, скажем, UBI-образ rootfs и прошить его в NAND-флеш или загрузится по NFS.
Приложение. Лог загрузки системы по NFS
MBOOT (UEMD mode): Version mboot-00045-gd0c2f07-dirty (Built 11 08:41:46 FET 2013)
OTP info: boot_source 2 jtag_stop 0 words_len 1024
Maximum bank size: 0x10000000 bytes
Detected 134217728 bytes of EM0 memory
MEMORY: 40000000 -> 48000000
Memory layout
0x00100010 early
0x001001B8 text
0x001176C8 data
0x0011F028 signature
0x0011F02C bss_start
0x00121D84 stack_start
0x00137BF8^ stack_ptr
0x00137C00 malloc
0x0013FC00 env
mnand_read_id: flash id 0xDC
mnand_read_id: flash ext_id 0x95
mnand_read_id: CS0 NAND 512MiB 3,3V 8-bit size(512) writesize(2048) oobsize(64) erasesize(131072)
mnand_read_id: flash id 0xDC
mnand_read_id: flash ext_id 0x95
mnand_read_id: CS1 NAND 512MiB 3,3V 8-bit size(512) writesize(2048) oobsize(64) erasesize(131072)
greth: Setting GRETH base addr to 0x20034000
greth: Found GRETH at 0x20034000, irq 255
greth: Resetting GRETH
greth: greth: 'phyaddr' not set, fall back to built-in table
greth: greth: using preset PHY addr: 1f
greth: Resetting the PHY
greth: write_mii: 0x20034010 < 0xF809F801 [p:31 a:0 d:0xF809]
greth: write_mii: 0x20034010 < 0x0000F801 [p:31 a:0 d:0x0000]
greth: 10/100 GRETH Ethermac at [0x20034000] irq 255. Running 10 Mbps half duplex
PHY info not available
greth: greth_init
greth: greth_init: enabling receiver
ETH new device: name GRETH_10/100
greth: GRETH: New MAC address: 00:02:f7:00:27:0f
Is there an EDCL emergency? Nope
MTD Partition: boot @ 0x00000000 size 0x00040000
MTD Partition: env @ 0x00040000 size 0x00040000
MTD Partition: kernel_dtb @ 0x00080000 size 0x00080000
MTD Partition: kernel @ 0x00100000 size 0x00400000
MTD Partition: rootfs @ 0x00500000 size 0x3FB00000
Hit any key (in 2 sec) to skip autoload...
Running autoload command 'mtdboot;bootm'
MTD Loading kernel image: dev kernel offset 0x000000000000 addr 0x40100000
Linux preparing to boot the kernel: machid 0xcd1
IMG moving image: type 2 from 0x40100040 to 0x40008000
HINT: To optimize boot time adjust loadaddr to: 0x40007fc0
Linux DTB start 0x40000100
Linux entry 0x40008000
Uncompressing Linux... done, booting the kernel.
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 3.10.18-uemd (sergei@shost) (gcc version 4.7.2 (crosstool-NG 1.18.0) ) #11 Tue Mar 4 13:48:01 FET 2014
[ 0.000000] CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
[ 0.000000] Machine: Module MB77.07, model: Module MB77.07
[ 0.000000] bootconsole [earlycon0] enabled
[ 0.000000] Memory policy: ECC disabled, Data cache writeback
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 23840
[ 0.000000] Kernel command line: console=ttyS0,38400 earlyprintk=serial root=/dev/nfs rw nfsroot=192.168.10.130:/srv/nfs/ ip=dhcp
[ 0.000000] PID hash table entries: 512 (order: -1, 2048 bytes)
[ 0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
[ 0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
[ 0.000000] Memory: 94MB 0MB = 94MB total
[ 0.000000] Memory: 89564k/89564k available, 41508k reserved, 0K highmem
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
[ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
[ 0.000000] vmalloc : 0xc8800000 - 0xff000000 ( 872 MB)
[ 0.000000] lowmem : 0xc0000000 - 0xc8000000 ( 128 MB)
[ 0.000000] modules : 0xbf000000 - 0xc0000000 ( 16 MB)
[ 0.000000] .text : 0xc0008000 - 0xc045c930 (4435 kB)
[ 0.000000] .init : 0xc045d000 - 0xc047d790 ( 130 kB)
[ 0.000000] .data : 0xc047e000 - 0xc04be178 ( 257 kB)
[ 0.000000] .bss : 0xc04be178 - 0xc053df90 ( 512 kB)
[ 0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[ 0.000000] NR_IRQS:128
[ 0.000000] regs = 0xf8000000, irq_start = 0
[ 0.000000] VIC @f8000000: id 0x00041192, vendor 0x41
[ 0.000000] regs = 0xf8010000, irq_start = 32
[ 0.000000] VIC @f8010000: id 0x00041192, vendor 0x41
[ 0.000000] UEMD: Firing up timer system
[ 0.000000] Clocksource: rate 54000000 mult 19418074 shift 20
[ 0.000000] Clockevent: rate 54000000 mult 231928233 shift 32
[ 0.000000] sched_clock: 32 bits at 100 Hz, resolution 10000000ns, wraps every 4294967286ms
[ 0.000000] Console: colour dummy device 80x30
[ 0.020000] Calibrating delay loop... 215.04 BogoMIPS (lpj=1075200)
[ 0.100000] pid_max: default: 32768 minimum: 301
[ 0.110000] Mount-cache hash table entries: 512
[ 0.130000] CPU: Testing write buffer coherency: ok
[ 0.150000] Setting up static identity map for 0xc030aa10 - 0xc030aa48
[ 0.160000] devtmpfs: initialized
[ 0.180000] NET: Registered protocol family 16
[ 0.200000] DMA: preallocated 256 KiB pool for atomic coherent allocations
[ 0.260000] OTP ROM is not flashed
[ 0.270000] msvdhd: configuring memory
[ 0.280000] hw-breakpoint: found 6 breakpoint and 1 watchpoint registers.
[ 0.290000] hw-breakpoint: maximum watchpoint size is 4 bytes.
[ 0.420000] bio: create slab <bio-0> at 0
[ 0.440000] SCSI subsystem initialized
[ 0.450000] ssp-pl022 20023000.ssp: ARM PL022 driver, device ID: 0x00041022
[ 0.460000] pl022: mapped registers from 0x20023000 to f8023000
[ 0.480000] usbcore: registered new interface driver usbfs
[ 0.490000] usbcore: registered new interface driver hub
[ 0.500000] usbcore: registered new device driver usb
[ 0.510000] media: Linux media interface: v0.10
[ 0.520000] Linux video capture interface: v2.00
[ 0.530000] Advanced Linux Sound Architecture Driver Initialized.
[ 0.550000] Switching to clocksource uemd_timer1
[ 0.650000] NET: Registered protocol family 2
[ 0.660000] TCP established hash table entries: 1024 (order: 1, 8192 bytes)
[ 0.670000] TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
[ 0.680000] TCP: Hash tables configured (established 1024 bind 1024)
[ 0.690000] TCP: reno registered
[ 0.700000] UDP hash table entries: 256 (order: 0, 4096 bytes)
[ 0.710000] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[ 0.720000] NET: Registered protocol family 1
[ 0.730000] RPC: Registered named UNIX socket transport module.
[ 0.740000] RPC: Registered udp transport module.
[ 0.750000] RPC: Registered tcp transport module.
[ 0.760000] RPC: Registered tcp NFSv4.1 backchannel transport module.
[ 0.830000] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[ 0.850000] msgmni has been set to 174
[ 0.870000] alg: No test for stdrng (krng)
[ 0.880000] io scheduler noop registered (default)
[ 0.900000] module,pinmux 20033084.sysconfigh: DVB_CI mode is GPIO (0)
[ 0.910000] module,pinmux 20033084.sysconfigh: TS1 mode is GPIO (0)
[ 0.920000] module,pinmux 20033084.sysconfigh: TS2 mode is GPIO (0)
[ 0.930000] module,pinmux 20033084.sysconfigh: NAND mode is peripheral (1)
[ 0.940000] module_vdu 80173000.vdu: found VDU device at 80173000, id <ebebab01>
[ 0.970000] Console: switching to colour frame buffer device 90x36
[ 0.990000] fb0: Module VDU frame buffer device
[ 1.040000] Serial: 8250/16550 driver, 3 ports, IRQ sharing disabled
[ 1.050000] 2002b000.uart: ttyS0 at MMIO 0x2002b000 (irq = 7) is a 8250
[ 1.060000] console [ttyS0] enabled, bootconsole disabled
[ 1.060000] console [ttyS0] enabled, bootconsole disabled
[ 1.070000] 20022000.uart: ttyS1 at MMIO 0x20022000 (irq = 9) is a 8250
[ 1.080000] 2002c000.uart: ttyS2 at MMIO 0x2002c000 (irq = 8) is a 8250
[ 1.120000] loop: module loaded
[ 1.130000] msvdhd 80180000.video_decoder: found device at 0x80180000, id 0x0025300b
[ 1.180000] NMC3_DRIVER probe OK
[ 1.200000] dev_ex->Name=NMC3_0
[ 1.220000] drivers/misc/rcmod_soc_nmc3.c#105: sync value ERROR code=0x4, memval=0x4
[ 1.240000] nmcadec: could not initialize NMC3_0
[ 1.260000] mnand CS0 Micron size(512) writesize(2048) oobsize(64) erasesize(131072)
[ 1.270000] mnand CS1 Micron size(512) writesize(2048) oobsize(64) erasesize(131072)
[ 1.280000] mnand: Detected 1073741824 bytes of NAND
[ 1.300000] libphy: greth-mdio: probed
[ 4.340000] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[ 4.350000] uemd-ehci 10040000.ehci: UEMD EHCI
[ 4.360000] uemd-ehci 10040000.ehci: new USB bus registered, assigned bus number 1
[ 4.370000] uemd-ehci 10040000.ehci: irq 35, io mem 0x10040000
[ 4.400000] uemd-ehci 10040000.ehci: USB 2.0 started, EHCI 1.00
[ 4.420000] hub 1-0:1.0: USB hub found
[ 4.430000] hub 1-0:1.0: 2 ports detected
[ 4.440000] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[ 4.450000] usbcore: registered new interface driver usb-storage
[ 4.460000] mousedev: PS/2 mouse device common for all mice
[ 4.470000] i2c /dev entries driver
[ 4.490000] module_hdmi: module_hdmi: Device ID: 0x9132
[ 4.530000] usbcore: registered new interface driver usbhid
[ 4.540000] usbhid: USB HID core driver
[ 4.570000] TCP: cubic registered
[ 4.580000] VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5
[ 4.610000] mvdu: will allocate buffers
[ 4.620000] mvdu: did allocate buffers cc000000
[ 4.660000] Sending DHCP requests ., OK
[ 4.690000] IP-Config: Got DHCP answer from 192.168.10.41, my address is 192.168.10.117
[ 4.710000] IP-Config: Complete:
[ 4.720000] device=eth0, hwaddr=00:02:f7:00:27:0f, ipaddr=192.168.10.117, mask=255.255.255.0, gw=192.168.10.1
[ 4.730000] host=192.168.10.117, domain=promwad.corp, nis-domain=(none)
[ 4.740000] bootserver=192.168.10.45, rootserver=192.168.10.130, rootpath=
[ 4.750000] nameserver0=192.168.10.41, nameserver1=192.168.10.42
[ 4.760000] ALSA device list:
[ 4.770000] #0: Module MB7707
[ 4.800000] VFS: Mounted root (nfs filesystem) on device 0:11.
[ 4.810000] devtmpfs: mounted
[ 4.830000] Freeing unused kernel memory: 128K (c045d000 - c047d000)
[ 4.850000] usb 1-1: new high-speed USB device number 2 using uemd-ehci
[ 5.020000] hub 1-1:1.0: USB hub found
[ 5.040000] hub 1-1:1.0: 4 ports detected
INIT: version 2.88 booting
[info] Using makefile-style concurrent boot in runlevel S.
[....] Starting the hotplug events dispatcher: udevd[ 39.850000] udevd[730]: starting version 175
. ok
[....] Synthesizing the initial hotplug events...done.
[....] Waiting for /dev to be fully populated...done.
[....] Activating swap...done.
[....] Cleaning up temporary files.... ok
[....] Activating lvm and md swap...done.
[....] Checking file systems...fsck from util-linux 2.20.1
done.
[....] Mounting local filesystems...done.
[....] Activating swapfile swap...done.
[....] Cleaning up temporary files.... ok
[....] Setting kernel variables ...done.
[....] Configuring network interfaces...done.
[....] Cleaning up temporary files.... ok
[....] Setting up X socket directories... /tmp/.X11-unix /tmp/.ICE-unix. ok
INIT: Entering runlevel: 2
[info] Using makefile-style concurrent boot in runlevel 2.
[....] Starting enhanced syslogd: rsyslogd. ok
[....] Starting periodic command scheduler: cron. ok
[....] Starting system message bus: dbus. ok
[....] Starting OpenBSD Secure Shell server: sshd. ok
Debian GNU/Linux 7 shost ttyS0
shost login: root
Password:
Last login: Thu Jan 1 00:01:26 UTC 1970 on ttyS0
Linux shost 3.10.18-uemd #11 Tue Mar 4 13:48:01 FET 2014 armv6l
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@shost:~# cat /etc/issue
Debian GNU/Linux 7 \n \l
root@shost:~#
Спасибо за внимание. Вопросы и комментарии приветствуются.