habrahabr

Микрокомпьютер Module MB 77.07 — русский ответ Raspberry Pi

  • четверг, 3 апреля 2014 г. в 03:10:38
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:~# 



Спасибо за внимание. Вопросы и комментарии приветствуются.