Содержание

Модуль EV-iMX287-Micro

Отступление

Вся нижеописанное относится к платам построенным на процессоре i.MX287(i.MX283/i.MX285/i.MX280) такими как EV-iMX287, EV-iMX287-Mini, SE-iMX287-Micro.

Документация

Вступление

Растущие требования к электронной аппаратуре все чаще склоняют разработчиков к применению операционной системы Linux. Наличие готовых драйверов под огромное количество периферии, наличие готовых стеков USB, TCP и т.п. значительно сокращают время выхода готового изделия на рынок. Мы предлагаем Вашему вниманию малогабаритный модуль SE-iMX287-Micro с процессором семейства i.MX28.

Краткое описание модуля SE-iMX287-Micro

Модуль SE-iMX287-Micro построен на микропроцессоре i.MX287 (Freescale). На модуле расположено все необходимое для построения полноценной системы – память DDR2 объемом 128 MB, память NAND Flash для хранения файловой системы объемом 256 МБ. На модуле установлена микросхема физического уровня Ethernet 10/100, для оргаганизации сетевого интерфейса к модулю остается только подключить разъем с встроенным трансформатором и светодиодами. На модуле предусмотрено место для установки памяти SPI Flash и I2C Flash. Для систем, в которых файловая система находится на карте памяти uSD необходимость в NAND Flash отпадает, таким образом можно оптимизировать стоимость системы. Ядро Линукс в данном случае находится в SPI Flash. Память I2C может быть использована для хранения настроек (MAC адрес, серийный номер изделия и т.д.) Модули полностью проверены и запрограммированы. В микросхеме NAND Flash содержится ядро Линукс 2.6.35 и файловая система. Не спешите сразу перезаписывать микросхему памяти NAND Flash. Установите модуль в материнскую плату EV-iMX287-MB или в плату Вашей разработки и подключив кабель к COM порту и подав питание на плату убедитесь в загрузке модуля, лог загрузки выдается в консоль. Процессор i.MX287 включен в программу длительного производства (компания Freescale гарантирует что он будет выпускаться в течении 15 лет после запуска в производство).

Для использования модуля SE-iMX287-Micro Вам достаточно создать собственную материнскую плату, с необходимыми интерфейсами. В большинстве случаев достаточно двухслойной платы 3-4 класса.

Механические характеристики модуля SE-iMX287-Micro

Габаритные размеры 50*40*10 мм.
Масса - 15 гр.

Электрические характеристики модуля SE-iMX287-Micro

Напряжение питания 5В +-5%
Номинальный ток потребления - 250 мА

Температурные характеристики модуля SE-iMX287-Micro

Рабочая температура для модуля с процессором i.MX287 -40…+85C
Рабочая температура для модуля с процессором i.MX283 -20…+85C
Температура хранения -55…+85С

Механический чертеж модуля SE-iMX287-Micro

3D файл модуля в формате Step (stp).
Принципиальная схема модуля в формате pdf.

Расположение контактов модуля SE-iMX287-Micro

Номер вывода Наименование вывода MUX1 MUX2 MUX3 GPIO Вывод CPU
1SSP0_DATA2SSP0_DATA2 GPIO2_2D6
2SSP0_DETECTSSP0_CARD_DET GPIO2_9D10
3SSP0_SCKSSP0_SCK GPIO2_10A6
4SSP0_DATA1SSP0_DATA1 GPIO2_1C6
5SSP0_DATA3SSP0_DATA3 GPIO2_3A5
6SSP0_DATA0SSP0_DATA0 GPIO2_0B6
7SSP0_CMDSSP0_CMD GPIO2_8A4
8LCD_RESETLCD_RESETLCD_VSYNC GPIO3_30M6
9LCD_D03LCD_D3ETM_DA8ETM_DA3GPIO1_3L3
10LCD_D01LCD_D1 ETM_DA1GPIO1_1K3
11LCD_RSLCD_RSLCD_DOTCLK GPIO1_26M4
12LCD_D05LCD_D5 ETM_DA5GPIO1_5M3
13LCD_ENABLELCD_ENABLE GPIO1_31N5
14LCD_WR_RWNLCD_WR_RWNLCD_HSYNCETM_TCLKGPIO1_25K1
15LCD_VSYNCLCD_VSYNCSAIF1_SDATA0 GPIO1_28L1
16LCD_D00LCD_D0 ETM_DA0GPIO1_0K2
17LCD_HSYNCLCD_HSYNCSAIF1_SDATA1ETM_TCTLGPIO1_29M1
18LCD_D02LCD_D2 ETM_DA2GPIO1_2L2
19LCD_D04LCD_D4ETM_DA9ETM_DA4GPIO1_4M2
20LCD_DOTCLKLCD_DOTCLKSAIF1_MCLKETM_TCLKGPIO1_30N1
21LCD_D06LCD_D6 ETM_DA6GPIO1_6N2
22LCD_D07LCD_D7 ETM_DA7GPIO1_7P1
23LCD_D08LCD_D8ETM_DA3ETM_DA8GPIO1_8P2
24LCD_D10LCD_D10 ETM_DA10GPIO1_10R1
25LCD_D11LCD_D11 ETM_DA11GPIO1_11R2
26LCD_D12LCD_D12 ETM_DA12GPIO1_12T1
27LCD_D13LCD_D13 ETM_DA13GPIO1_13T2
28LCD_D14LCD_D14 ETM_DA14GPIO1_14U2
29LCD_D09LCD_D9ETM_DA4ETM_DA9GPIO1_9P3
30LCD_D17LCD_D17 ETM_DA6GPIO1_17R3
31LCD_D16LCD_D16 ETM_DA7GPIO1_16T3
32LCD_D15LCD_D15 ETM_DA15GPIO1_15U3
33LCD_RD_ELCD_RD_ELCD_VSYNCETM_TCTLGPIO1_24P4
34LCD_D20LCD_D20EN-ET1_1588_EVENT2_OUTETM_DA3GPIO1_20R4
35LCD_D19LCD_D19 ETM_DA4GPIO1_19T4
36LCD_D18LCD_D18 ETM_DA5GPIO1_18U4
37LCD_CSLCD_CSLCD_ENABLE GPIO1_27P5
38LCD_D23LCD_D23EN-ET1_1588_EVENT3_INETM_DA0GPIO1_23R5
39LCD_D22LCD_D22EN-ET1_1588_EVENT3_OUTETM_DA1GPIO1_22T5
40LCD_D21LCD_D21EN-ET1_1588_EVENT2_INETM_DA2GPIO1_21U5
41SSP2_MISOSSP2_D0AUART3_RXSAIF1_SDATA1GPIO2_18B3
42SSP2_SCKSSP2_SCKAUART2_RXSAIF0_SDATA1GPIO2_16A3
43SSP3_MISOSSP3_D0AUART4_RTSEN-ET1_1588_EVENT1_OUTGPIO2_26B2
44SSP3_SCKSSP3_SCKAUART4_TXEN-ET1_1588_EVENT0_OUTGPIO2_24A2
45SSP2_MOSISSP2_CMDAUART2_TXSAIF0_SDATA2GPIO2_17C3
46SSP1_SCKSSP1_SCKSSP2_D1EN-ET0_1588_EVENT2_OUTGPIO2_12B1
47SSP3_MOSISSP3_CMDAUART4_RXEN-ET1_1588_EVENT0_INGPIO2_25C2
48SSP1_CMDSSP1_CMDSSP2_D2EN-ET0_1588_EVENT2_INGPIO2_13C1
49SSP2_SS1SSP2_D4SSP2_D1USB1_OVERCURRENTGPIO2_20D3
50SSP3_SS0SSP3_D3AUART4_CTSEN-ET1_1588_EVENT1_INGPIO2_27D2
51SSP1_DATA0SSP1_D0SSP2_D6EN-ET0_1588_EVENT3_OUTGPIO2_14D1
52SSP0_DATA6SSP0_D6SSP2_CMD GPIO2_6D5
53SSP0_DATA5SSP0_D5SSP2_D3 GPIO2_5C5
54SSP0_DATA4SSP0_D4SSP2_D0 GPIO2_4B5
55SSP0_DATA7SSP0_D7SSP2_SCK GPIO2_7B4
56SSP2_SS2SSP2_D5SSP2_D2USB0_OVERCURRENTGPIO2_21D4
57GPMI_D06GPMI_D6SSP1_D6 GPIO0_6U6
58SSP1_DATA3SSP1_D3SSP2_D7EN-ET0_1588_EVENT3_INGPIO2_15E1
59GPMI_D07GPMI_D7SSP1_D7 GPIO0_7T6
60GPMI_D05GPMI_D5SSP1_D5 GPIO0_5R7
61GPMI_D04GPMI_D4SSP1_D4 GPIO0_4T7
62GPMI_D03GPMI_D3SSP1_D3 GPIO0_3U7
63GPMI_D01GPMI_D1SSP1_D1 GPIO0_1T8
64GPMI_D02GPMI_D2SSP1_D2 GPIO0_2R8
65GPMI_CLEGPMI_CLESSP3_D2SSP3_D5GPIO0_27P7
66GPMI_D00GPMI_D0SSP1_D0 GPIO0_0U8
67GPMI_WRNGPMI_WRNSSP1_SCK GPIO0_25P8
68GPMI_RDNGPMI_RDNSSP3_SCK GPIO0_24R6
69GPMI_RDY1GPMI_READY1SSP1_CMD GPIO0_21N8
70GPMI_ALEGPMI_ALESSP3_D1SSP3_D4GPIO0_26P6
71GPMI_CE1NGPMI_CE1NSSP3_D3 GPIO0_17N9
72ENET0_RX_CLKENET0_RX_CLKENET0_RX_EREN-ET0_1588_EVENT2_INGPIO4_13F3
73ENET0_TXD3ENET0_TXD3ENET1_TXD1EN-ET0_1588_EVENT1_INGPIO4_12G2
74ENET0_TXD2ENET0_TXD2ENET1_TXD0EN-ET0_1588_EVENT1_OUTGPIO4_11G1
75ENET0_COLENET0_COLENET1_TX_ENEN-ET0_1588_EVENT3_OUTGPIO4_14J4
76ENET0_CRSENET0_CRSENET1_RX_ENEN-ET0_1588_EVENT3_INGPIO4_15J3
77ENET0_RXD2ENET0_RXD2ENET1_RXD0EN-ET0_1588_EVENT0_OUTGPIO4_9J1
78ENET0_RXD3ENET0_RXD3ENET1_RXD1EN-ET0_1588_EVENT0_INGPIO4_10J2
79ENET_CLKCLKCTRL_ENET GPIO4_16E2
80ENET0_TX_CLKENET0_TX_CLKHSADC_TRIGGEREN-ET0_1588_EVENT2_OUTGPIO4_5E3
81ENET0_MDIOENET0_MDIOGPMI_CE5NSAIF0_SDATA2GPIO4_1H4
82ENET0_MDCENET0_MDCGPMI_CE4NSAIF0_SDATA1GPIO4_0G4
83AUART0_CTSAUART0_CTSAUART4_RXDUART_RXGPIO3_2J6
84AUART0_RTSAUART0_RTSAUART4_TXDUART_TXGPIO3_3J7
85AUART3_CTSAUART3_CTSCAN1_TXEN-ET0_1588_EVENT1_OUTGPIO3_14L6
86AUART3_RTSAUART3_RTSCAN1_RXEN-ET0_1588_EVENT1_INGPIO3_15K6
87AUART3_RXAUART3_RXCAN0_TXEN-ET0_1588_EVENT0_OUTGPIO3_12M5
88AUART3_TXAUART3_TXCAN0_RXEN-ET0_1588_EVENT0_INGPIO3_13L5
89AUART2_RXAUART2_RXSSP3_D1SSP3_D4GPIO3_8F6
90AUART2_TXAUART2_TXSSP3_D2SSP3_D5GPIO3_9F5
91AUART1_RXAUART1_RXSSP2_CARD_DETECTPWM_0GPIO3_4L4
92AUART1_TXAUART1_TXSSP3_CARD_DETECTPWM_1GPIO3_5K4
93AUART0_RXAUART0_RXI2C0_SCLDUART_CTSGPIO3_0G5
94AUART0_TXAUART0_TXI2C0_SDADUART_RTSGPIO3_1H5
95GPMI_RDY3GPMI_RDY3CAN0_RXHSADC_TRIGGERGPIO0_23L8
96GPMI_RDY2GPMI_RDY2CAN0_TXENET0_TX_ERGPIO0_22M8
97GPMI_CE3NGPMI_CE3NCAN1_RXSAIF1_MCLKGPIO0_19M9
98GPMI_CE2NGPMI_CE2NCAN1_TXENET0_RX_ERGPIO0_18M7
99PWM0PWM0I2C1_SCLDUART_RXGPIO3_16K7
100PWM1PWM1I2C1_SDADUART_TXGPIO3_17L7
101GPMI_CE0GPMI_CE0N SSP3_D0 GPIO0_16 N7
102GPMI_READY0GPMI_RDNSSP3_SCK GPIO0_20 N6
103PWM3PWM3 E9
104PWM4PWM4 E10
105 AUART2_CTS AUART2_CTS I2C1_SCL SAIF1_BITCLK GPIO3_10 H6
106 AUART2_RTS AUART2_RTS I2C1_SDA SAIF1_LRCLK GPIO3_11 H7
107 I2C0_SCL I2C0_SCL TIMROT_ROTARYA DUART_RX GPIO3_24 C7
108 I2C0_SDA I2C0_SDA TIMROT_ROTARYB DUART_TX GPIO3_25 D8
109 SAIF1_SDATA0 SAIF1_SDATA0 PWM7 SAIF0_SDATA1 GPIO3_26 E8
110 SAIF0_BITCLK SAIF0_BITCLK PWM5 AUART4_RX GPIO3_22 F7
111 SAIF0_MCLK SAIF0_MCLK PWM3 AUART4_CTS GPIO3_20 G7
112 SAIF0_SDATA0 SAIF0_SDATA0 PWM6 AUART4_TX GPIO3_23 E7
113 SPDIF SPDIF ENET1_RX_ER GPIO3_27 D7
114 SAIF0_LRCLK SAIF0_LRCLK PWM4 AUART4_RTS GPIO3_21 G6
115 VOUT 3V3
116 VOUT 3V3
117 PSWITCH A11
118 VDDXTAL C12
119 VIN 5V
120 VIN 5V
121 VDD4P2 A13
122 LI-ION A15+B15
123 GND
124 GND
125 VIN 5V
126 VIN 5V
127 LRADC5 D15
128 LRADC4 D13
129 LRADC0 C15
130 LRADC6 C14
131 HSADC0 B14
132 LRADC1 C9
133 LRADC2 C8
134 LRADC3 D9
135 PWM2 PWM2 USB0_ID USB1_OVERCURRENT GPIO3_18 K8
136 RESETN A14
137 USB0DP B10
138 USB0DM A10
139 AUART1_CTS AUART1_CTS USB0_OVERCURRENT TIMROT_ROTARYA GPIO3_6 K5
140 AUART1_RTS AUART1_RTS USB0_ID TIMROT_ROTARYB GPIO3_7 J5
141 USB1DP A8
142 USB1DM B8
143 ETH0_LED1 Сигнал LAN8720
144 ETH0_LED0 Сигнал LAN8720
145 ETH0_TX_N Сигнал LAN8720
146 ETH0_TX_P Сигнал LAN8720
147 VOUT 3V3
148 GND
149 ETH0_RX_P Сигнал LAN8720
150 ETH0_RX_N Сигнал LAN8720

Подготовка к работе с модулем

Материнская плата EV-iMX287-MB

Для быстрого ознакомления с модулем рекомендуется материнская плата EV-iMX287-MB-Mini, на которой предусмотрено место для установки модуля SE-iMX287-Micro, 2 разъема USB, один разъем 10/100 Ethernet, держатель микро SD карты и отладочный интерфейс DUART (RS-232), который может быть использован в качестве консоли. Все остальные выводы модуля выведены на штыревые разъемы с шагом 2.54 мм. Питание материнской платы 5В/2А. На материнской плате расположен штыревой разъем X6, который позволяет подключать TFT модули SK-MI0430FT-PLUG, SK-ATM0700D-PLUG , EV-ATM5HD-PLUG. Для подключения материнской платы к компьютеру необходим стандартный нуль модемный кабель со следующей распиновкой:

Также Вам понадобится терминальная программа, мы рекомендуем использовать PuTTY

Для выбора источника загрузки процессора предназначен DIP-Switch переключатель S1. Возможны следующие режимы загрузки процессора:

Источник загрузки Boot0 Boot1 Boot2 Boot3
NAND Flash 0 0 1 0
USB 0 0 0 0
SSP2 (SPI Flash) 0 1 0 0
SDCARD 1 0 0 1

Образ виртуальной машины

Для сборки ядра, файловой системы и загрузчика предоставляется настроенная виртуальная машина с установленной операционной системой Linux Ubuntu. Вам необходимо загрузить программу VirtualBox, установить ее на Ваш компьютер и открыть подготовленный образ виртуальной машины. Все необходимое содержится в каталоге home/evodbg/Projects/ev-imx287/ltib/
Все дальнейшие действия выполняются в каталоге ltib (home/evodbg/Projects/ev-imx287/ltib/)

Образ виртуальной машины (размер файла 5.6ГБ)

О *.sb файлах

Для успешной загрузки процессорам серии i.MX28 требуется ядро или загрузчик со специальным заголовком. Вкратце - это специальный заголовок, в котором содержится инициализация регистров питания и памяти DDR2. Этим занимается минимальный загрузчик imx-bootlets. Его собранный код записывается вначале файла ядра или загрузчика для получения загрузочных файлов imx28_ivt_linux.sb или imx28_ivt_uboot.sb. Если загрузка системы предполагается из NAND Flash, SPI Flash, SDcard то загрузчик imx28_ivt_uboot.sb является необязательным. Использование imx28_ivt_uboot.sb может быть оправданным, когда ядро системы грузится по сети (tftp), поскольку сам процессор загружаться по сети не умеет. В этом случае стартует imx28_ivt_uboot.sb из любого возможного места (NAND Flash, SPI Flash, SDcard) и далее загружает уже ядро (по сети, с USB, карты памяти и т.д.).

Сборка ядра (kernel), загрузчика (u-boot) и файловой системы (rootfs)

В большинстве случаев может потребоваться пересобрать загрузчик (u-boot), ядро (kernail) или файловую систему (rootfs). Это может быть вызвано необходимостью переназначением функций выводов модуля, включением/отключением какой-либо периферии, изменение драйверов и т.п. Система сборки LTIB (Linux Target Image Builder) позволяет производить сборку загрузчика, ядра и файловой системы в рамках одной системы. Результатом работы LTIB являются следующие файлы и папки:

…/ltib/rootfs - каталог с собранной файловой системой …/ltib/rootfs.ext2.gz - архив собранной файловой системы в виде тома ext2 (если в настройках был выбран данный формат) …/ltib/rootfs.jffs2 - собранная файловая система в формате jffs2 (если в настройках был выбран данный формат) …/ltib/rootfs/boot/uImage - собранное ядро в elf формате …/ltib/rootfs/boot/u-boot - собранный загрузчик в elf формате …/ltib/rootfs/boot/imx28_ivt_uboot.sb - собранный и «обернутый» загрузчик …/ltib/rootfs/boot/imx28_ivt_linux.sb - собранное и «обернутое» ядро

Это неполный список файлов, но именно они будут использоваться в работе. Похожие файлы imx28_uboot.sb и imx28_linux.sb (HAB - disabled) нас пока не интересуют, они будут рассмотрены ниже.

В некоторых случаях для работы потребуется архив tar.bz2 с файловой системой. Он не создается автоматически, но его можно получить запустив скрипт …/ltib/make_rootfs_bz2.sh.

Сборка загрузчика (u-boot)

Исходный код загрузчика находится в home/evodbg/Projects/ev-imx287/ltib/rpm/BUILD/u-boot-2009.08
Борд файл платы - home/evodbg/Projects/ev-imx287/ltib/rpm/BUILD/u-boot-2009.08/board/freescale/mx28_evk/mx28_evk.c
Конфиг файл платы - home/evodbg/Projects/ev-imx287/ltib/rpm/BUILD/u-boot-2009.08/include/configs/mx28_evk.h Чтобы пересобрать u-boot выполните:

./ltib -m scbuild -p u-boot

В папке home/evodbg/Projects/ev-imx287/ltib/rpm/BUILD/u-boot-2009.08/ будут созданы файлы u-boot и u-boot.bin.
Теперь они должны быть перемещены в каталог home/evodbg/Projects/ev-imx287/ltib/rootfs/boot/ Это можно сделать простым копированием

sudo cp -fr u-boot /home/rusar/Projects/evodbg/EV-iMX287/Micro287/LtibMicro/ltib/rootfs/boot/
sudo cp -fr u-boot.bin /home/rusar/Projects/evodbg/EV-iMX287/Micro287/LtibMicro/ltib/rootfs/boot/ 

или выполнив команду

./ltib -m scdeploy -p u-boot

Теперь необходимо создать u-boot с заголовком (sb-файл). Это выполняется командой:

./ltib -p boot_stream.spec -f

В результате, в каталоге /home/rusar/Projects/evodbg/EV-iMX287/Micro287/LtibMicro/ltib/rootfs/boot/ появится файл imx28_ivt_uboot.sb который можно запрограммировать в NAND Flash, SPI Flash или на SD карту. Чуть ниже мы рассмотрим процедуры программирования.

Сборка ядра (kernel) и файловой системы (rootfs)

Исходный код ядра находится в home/evodbg/Projects/ev-imx287/ltib/rpm/BUILD/linux-2.6.35.3
Борд файл платы - home/evodbg/Projects/ev-imx287/ltib/rpm/BUILD/linux-2.6.35.3/arch/arm/mach-mx28/mx28evk.c
В первый раз рекомендуется запустить:

./ltib -- selectype

и убедиться, что в пункте «Selection» –> выбрано (use packages in preconfig (Min profile))

Выбираем Exit и попадаем в следующее меню. В дальнейшем нет необходимости в запуске «ltib –selectype». Только если Вам потребуется создать файл updater_ivt.sb (используется утилитой MFGTools) необходимо будет запустив «ltib –selectype» выбрать в меню «mfg firmware profile».

Итак, убедившись, что выбран use packages in preconfig (Min profile) выходим нажав Exit и в дальнейшем для входа в меню конфигурирования параметров используем команду

./ltib -c 

Убедитесь, что выбраны опции:
[*] Always rebuild the kernel - всегда пересобирать ядро
[*] Configure the kernel - вызвать menuconfig для настройки ядра.

В зависимости от того, где будет находится файловая система (rootfs) надо сразу задать командную строку
Заходим в Package List и меняем строку на нужную нам, варианты следующие:

Правим только верхнюю строчку!
файловая системам расположена на карточке:

noinitrd console=ttyAM0,115200 root=/dev/mmcblk0p3 rw rootwait ip=none gpmi

файловая система NFS:

noinitrd console=ttyAM0,115200 fec_mac=00:08:02:6B:A3:1A root=/dev/nfs nfsroot=10.193.100.213:/data/rootfs_home/rootfs_mx28 rw ip=dhcp rootwait gpmi

файловая система расположена в микросхеме NAND Flash:

noinitrd console=ttyAM0,115200 ubi.mtd=1 root=ubi0:rootfs0 rootfstype=ubifs rw gpmi

файловая система расположена в RAM:

noinitrd console=ttyAM0,115200 root=/dev/ram0 rdinit=/sbin/init fec_mac=00:08:02:6B:A3:1A gpmi

Здесь же выбираем пакеты, которые необходимо включить в файловую систему.
Exit.
Заходим в Target Image Generation - Options и в Target Image выбираем формат создаваемой файловой системы:
ext2.gz ramdisk - если файловая система будет на SD карточке.
jffs2 - если требуется rootfs c файловой системой jffs.
initramfs - если в памяти RAM


Exit, на вопрос о сохранение изменений ответить Yes.
Запустится процесс подготовки сборки. (Если говорить точнее, то одновременно и файловой системы, но об этом позже). Через несколько секунд откроется окно menuconfig, в котором вы можете сконфигурировать сборку ядра (выбрать драйверы и компоненты которые будут собираться, поддержку нужных файловых систем (ext2, ext3, ext4, fat и т.п.)

После настройки необходимых пунктов, Exit. Начнется процесс сборки, который может занять от нескольких минут до получаса.
Build Succeeded говорит о успешном окончании сборки.

Рекомендуем выполнить скрипт …/ltib/make_rootfs_bz2.sh чтобы создать еще архив файловой системы tar.bz2

Результатом сборки является следующее: каталог /ltib/rootfs c распакованной файловой системой (создается всегда)
файл rootfs.ext2.gz если был выбран данный формат файловой системы
файл rootfs.jffs2 если был выбран данный формат файловой системы
файл /ltib/rootfs/boot/uImage - собранное ядро в elf формате (пригодное для загрузки загрузчиком u-boot например по tftp
файл rootfs.tar.bz результат выполнения скрипта make_rootfs_bz2.sh

Теперь, для получения ядра или загрузчика пригодных к непосредственной загрузке процессором необходимо создать файлы uImage и u-boot с заголовком для получения *.sb файлов:
выполняем:

./ltib -p boot_stream.spec -f

В результате этого в папке /ltib/rootfs/boot/ появятся файлы:
imx28_ivt_linux.sb - ядро
imx28_ivt_uboot.sb - загрузчик
Файлы imx28_linux.sb и imx28_uboot.sb нас пока не интересуют, они будут описаны ниже
Итак, загрузчик, ядро, файловую систему собрали, можно приступать к загрузке их в плату. Надо заметить, что Вы можете собрать файловую систему в Buildroot, Ptxdist, Openembedded и использовать ее, никаких ограничений нет, дело привычки. Кстати собранную Вами rootfs в других системах сборки можно превратить в ext2 выполнив:

genext2fs -b 150000 -d ./Ваш католог rootfs.ext2 (150000 - размер генерируемого тома в кБ)

Также и u-boot можно собрать запустив:

make -j4 CROSS_COMPILE=/opt/arm-2009q3/bin/arm-none-linux-gnueabi- ARCH=arm

и ядро

make -j4 CROSS_COMPILE=/opt/arm-2009q3/bin/arm-none-linux-gnueabi- ARCH=arm uImage

Просто LTIB позволяет это делать централизованно. Если необходимо в каком-либо пакете файловой системе изменить исходный код, то сделать это можно следующим образом (на примере kobs-ng):

./ltib -m prep -p kobs-ng   - подготавливаем пакет (он будет в /home/rusar/Projects/evodbg/EV-iMX287/Micro287/LtibMicro/ltib/rpm/BUILD/ )
что-то в нем меняем...
./ltib -m scbuild -p kobs-ng - собираем
./ltib -m scdeploy -p kobs-ng - встраиваем в файловую систему

Создание загрузочной SD карты

Итак, ядро, загрузчик и файловая система созданы, можно пробовать их загрузить.
Загрузочную SD карту можно создать как на компьютерах с ОС Windows, так и с ОС Linux.
Рассмотрим сначала создание в ОС Windows, для этого предназначена утилита cfimager.exe:
Создаем отдельную папку в которую копируем файлы cfimager.exe, imx28_ivt_uboot.sb, imx28_ivt_linux.sb, rootfs.ext.gz. Файл rootfs.ext2 из архива rootfs.ext.gz распаковываем прямо в эту папку.
Подключаем картридер, устанавливаем в него карточку, запоминаем букву диска, назначенную Windows карточке. Выполняем команду (или создаем bat файл, в который прописываем следующее, изменив букву диска на свою!):

cfimager -a -f imx28_ivt_uboot.sb -d f  (f - измените на вашу букву диска)

Результатом будет загрузочная SD карта с записанным загрузчиком (u-boot)
или выполняем:

cfimager.exe -a -f imx28_ivt_linux.sb -e rootfs.ext2 -dual_boot -d f (f - измените на вашу букву диска)

Результатом будет загрузочная SD карта с записанным ядром и файловой системой.
Извлекаем карточку из картридера, устанавливаем в плату, с помощью DIP-SWITCH выставляем режим загрузки процессора с SD карты (1001), подключаем плату к COM порту компьютера, запускаем терминальную программу (рекомендуем Putty), параметры порты 115200, 8 бит, без контроля потока и подаем питание.
В терминальной программе будет лог загрузки Linux, который заканчивается монтированием файловой системы и приглашением на ввод логина (логин по умолчанию root).

HTLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLFLC
PowerPrep start initialize power...

Configured for 5v only power source.            Battery powered operation disabl        ed.
LLLCMay 17 201319:52:58
FRAC 0x92925552
memory type is DDR2
                   Wait for ddr ready 1power 0x00820710
1311 Frac 0x92925552
start change cpu freq
hbus 0x00000003
cpu 0x00010001
LLLLLLLFLCLLJUncompressing Linux... done, booting the kernel.
Linux version 2.6.35.3-670-g914558e (rusar@v1310) (gcc version 4.4.4 (4.4.4_09.0        6.2010) ) #7 PREEMPT Mon Jun 10 13:35:12 EEST 2013
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
CPU: VIVT data cache, VIVT instruction cache
Machine: Freescale MX28EVK board
Memory policy: ECC disabled, Data cache writeback
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 32512
Kernel command line: -e noinitrd console=ttyAM0,115200 root=/dev/mmcblk0p3 rw ro        otwait ip=none gpmi
PID hash table entries: 512 (order: -1, 2048 bytes)
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 128MB = 128MB total
Memory: 118976k/118976k available, 12096k reserved, 0K highmem
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
    DMA     : 0xfde00000 - 0xffe00000   (  32 MB)
    vmalloc : 0xc8800000 - 0xf0000000   ( 632 MB)
    lowmem  : 0xc0000000 - 0xc8000000   ( 128 MB)
    modules : 0xbf000000 - 0xc0000000   (  16 MB)
      .init : 0xc0008000 - 0xc0030000   ( 160 kB)
      .text : 0xc0030000 - 0xc052b000   (5100 kB)
      .data : 0xc052c000 - 0xc0564e20   ( 228 kB)
SLUB: Genslabs=11, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Hierarchical RCU implementation.
        RCU-based detection of stalled CPUs is disabled.
        Verbose stalled-CPUs detection is disabled.
NR_IRQS:288
Console: colour dummy device 80x30
console [ttyAM0] enabled
Calibrating delay loop... 226.09 BogoMIPS (lpj=1130496)
pid_max: default: 32768 minimum: 301
Security Framework initialized
SELinux:  Initializing.
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
devtmpfs: initialized
regulator: core version 0.5
NET: Registered protocol family 16
regulator: vddd: 800 <--> 1575 mV at 1500 mV fast normal
regulator: vdddbo: 800 <--> 1575 mV fast normal
regulator: vdda: 1500 <--> 2275 mV at 1800 mV fast normal
vddio = 3380000, val=10
regulator: vddio: 2880 <--> 3680 mV at 3380 mV fast normal
regulator: overall_current: fast normal
regulator: vbus5v:
regulator: mxs-duart-1: fast normal
regulator: mxs-bl-1: fast normal
regulator: mxs-i2c-1: fast normal
regulator: mmc_ssp-1: fast normal
regulator: mmc_ssp-2: fast normal
regulator: charger-1: fast normal
regulator: power-test-1: fast normal
regulator: cpufreq-1: fast normal
i.MX IRAM pool: 124 KB@0xc8820000
Initializing GPMI pins
usb DR wakeup device is registered
IMX usb wakeup probe
audit: cannot initialize inotify handle
bio: create slab <bio-0> at 0
SCSI subsystem initialized
Freescale USB OTG Driver loaded, $Revision: 1.55 $
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
Advanced Linux Sound Architecture Driver Version 1.0.23.
Switching to clocksource mxs clock source
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 4096 (order: 3, 32768 bytes)
TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
TCP reno registered
UDP hash table entries: 256 (order: 0, 4096 bytes)
UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
NET: Registered protocol family 1
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
Trying to unpack rootfs image as initramfs...
rootfs image is not initramfs (junk in compressed archive); looks like an initrd
Freeing initrd memory: 5120K
Bus freq driver module loaded
IMX usb wakeup probe
usb h1 wakeup device is registered
mxs_cpu_init: cpufreq init finished
audit: initializing netlink socket (disabled)
type=2000 audit(0.700:1): initialized
VFS: Disk quotas dquot_6.5.2
Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
JFFS2 version 2.2. (NAND) б╘ 2001-2006 Red Hat, Inc.
msgmni has been set to 242
alg: No test for stdrng (krng)
cryptodev: driver loaded.
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253)
io scheduler noop registered
io scheduler deadline registered
io scheduler cfq registered (default)
Console: switching to colour frame buffer device 100x30
mxs-duart.0: ttyAM0 at MMIO 0x80074000 (irq = 47) is a DebugUART
mxs-auart.0: ttySP0 at MMIO 0x8006a000 (irq = 112) is a mxs-auart.0
Found APPUART 3.1.0
mxs-auart.1: ttySP1 at MMIO 0x8006c000 (irq = 113) is a mxs-auart.1
Found APPUART 3.1.0
mxs-auart.2: ttySP2 at MMIO 0x8006e000 (irq = 114) is a mxs-auart.2
Found APPUART 3.1.0
mxs-auart.3: ttySP3 at MMIO 0x80070000 (irq = 115) is a mxs-auart.3
Found APPUART 3.1.0
mxs-auart.4: ttySP4 at MMIO 0x80072000 (irq = 116) is a mxs-auart.4
Found APPUART 3.1.0
brd: module loaded
loop: module loaded
i.MX GPMI NFC
NFC: Version 1, 8-chip GPMI and BCH
Boot ROM: Version 1, Single-chip boot area, block mark swapping supported
Scanning for NAND Flash chips...
NAND device: Manufacturer ID: 0xec, Chip ID: 0xd3 (Samsung NAND 1GiB 3,3V 8-bit)
-----------------------------
NAND Flash Device Information
-----------------------------
Manufacturer      : Samsung (0xec)
Device Code       : 0xd3
Cell Technology   : SLC
Chip Size         : 1 GiB
Pages per Block   : 64
Page Geometry     : 2048+64
ECC Strength      : 4 bits
ECC Size          : 512 B
Data Setup Time   : 25 ns
Data Hold Time    : 15 ns
Address Setup Time: 35 ns
GPMI Sample Delay : 6 ns
tREA              : Unknown
tRLOH             : Unknown
tRHOH             : Unknown
Description       : K9K8G08UXM, K9NBG08U5A, K9WAG08U1A
-----------------
Physical Geometry
-----------------
Chip Count             : 1
Page Data Size in Bytes: 2048 (0x800)
Page OOB Size in Bytes : 64
Block Size in Bytes    : 131072 (0x20000)
Block Size in Pages    : 64 (0x40)
Chip Size in Bytes     : 1073741824 (0x40000000)
Chip Size in Pages     : 524288 (0x80000)
Chip Size in Blocks    : 8192 (0x2000)
Medium Size in Bytes   : 1073741824 (0x40000000)
------------
NFC Geometry
------------
ECC Algorithm          : BCH
ECC Strength           : 8
Page Size in Bytes     : 2112
Metadata Size in Bytes : 10
ECC Chunk Size in Bytes: 512
ECC Chunk Count        : 4
Payload Size in Bytes  : 2048
Auxiliary Size in Bytes: 16
Auxiliary Status Offset: 12
Block Mark Byte Offset : 1999
Block Mark Bit Offset  : 0
-----------------
Boot ROM Geometry
-----------------
Boot Area Count            : 1
Boot Area Size in Bytes    : 20971520 (0x1400000)
Stride Size in Pages       : 64
Search Area Stride Exponent: 2
Scanning device for bad blocks
Bad eraseblock 3749 at 0x00001d4a0000
Bad eraseblock 3772 at 0x00001d780000
Bad eraseblock 4735 at 0x000024fe0000
Bad eraseblock 5969 at 0x00002ea20000
Boot area protection is enabled.
Creating 2 MTD partitions on "gpmi-nfc-main":
0x000000000000-0x000001400000 : "gpmi-nfc-0-boot"
0x000001400000-0x000040000000 : "gpmi-nfc-general-use"
mxs-spi mxs-spi.0: Max possible speed 24000 = 24000000/2 kHz
m25p80 spi1.0: mx25l6405d (8192 Kbytes)
Creating 3 MTD partitions on "m25p80":
0x000000000000-0x000000100000 : "bootloader"
0x000000100000-0x000000400000 : "kernel"
0x000000400000-0x000001fe0000 : "rootfs"
mtd: partition "rootfs" extends beyond the end of device "m25p80" -- size trunca        ted to 0x400000
mxs-spi mxs-spi.0: at 0x80014000 mapped to 0xF0014000, irq=84, bus 1, DMA ver_ma        jor 4
Freescale FlexCAN Driver
FEC Ethernet Driver
fec_enet_mii_bus: probed
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
fsl-ehci fsl-ehci: Freescale On-Chip EHCI Host Controller
fsl-ehci fsl-ehci: new USB bus registered, assigned bus number 1
fsl-ehci fsl-ehci: irq 93, io base 0x80080000
fsl-ehci fsl-ehci: USB 2.0 started, EHCI 1.00
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 1 port detected
fsl-ehci fsl-ehci.0: Freescale On-Chip EHCI Host Controller
fsl-ehci fsl-ehci.0: new USB bus registered, assigned bus number 2
fsl-ehci fsl-ehci.0: irq 92, io base 0x80090000
fsl-ehci fsl-ehci.0: USB 2.0 started, EHCI 1.00
hub 2-0:1.0: USB hub found
hub 2-0:1.0: 1 port detected
usbcore: registered new interface driver cdc_acm
cdc_acm: v0.26:USB Abstract Control Model driver for USB modems and ISDN adapter        s
usbcore: registered new interface driver usblp
usbcore: registered new interface driver cdc_wdm
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
ARC USBOTG Device Controller driver (1 August 2005)
g_ether gadget: using random self ethernet address
g_ether gadget: using random host ethernet address
usb0: MAC e2:6b:d0:e6:22:00
usb0: HOST MAC 5e:3a:ee:e7:92:c3
g_ether gadget: Ethernet Gadget, version: Memorial Day 2008
g_ether gadget: g_ether ready
fsl-usb2-udc: bind to driver g_ether
mice: PS/2 mouse device common for all mice
input: MXS touchscreen as /devices/virtual/input/input0
MXS RTC driver v1.0 hardware v2.3.0
mxs-rtc mxs-rtc.0: rtc core: registered mxs-rtc as rtc0
i2c /dev entries driver
Linux video capture interface: v2.00
mxs-pxp mxs-pxp.0: initialized
This is 5V only build.
mxs watchdog: initialized, heartbeat 19 sec
mxs-mmc: MXS SSP Controller MMC Interface driver
mxs-mmc mxs-mmc.0: mmc0: MXS SSP MMC DMAIRQ 82 ERRIRQ 96
dcp dcp.0: DCP crypto enabled.!
usbcore: registered new interface driver hiddev
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
sgtl5000-i2c 0-000a: SGTL5000 revision 17
mmc0: new SD card at address e624
mmcblk0: mmc0:e624 SU01G 968 MiB
 mmcblk0:
 p1 p2 p3
No device for DAI mxs-saif
asoc: SGTL5000 <-> mxs-saif mapping ok
Failed to add route LINE_OUT->Ext Spk
ALSA device list:
  #0: mxs-evk (SGTL5000)
TCP cubic registered
NET: Registered protocol family 17
can: controller area network core (rev 20090105 abi 8)
NET: Registered protocol family 29
can: raw protocol (rev 20090105)
mxs-rtc mxs-rtc.0: setting system clock to 1970-01-01 00:00:23 UTC (23)
VFS: Mounted root (ext2 filesystem) on device 179:3.
devtmpfs: mounted
Freeing init memory: 160K
starting pid 1150, tty '': '/etc/rc.d/rcS'
Mounting /proc and /sys
Starting the hotplug events dispatcher udevd
Synthesizing initial hotplug events
Setting the hostname to freescale
Mounting filesystems
mount: sysfs already mounted or /sys busy
mount: according to mtab, /sys is already mounted on /sys
mount: mount point /proc/bus/usb does not exist
Generating keys for the dropbear ssh server:
Will output 1024 bit rsa secret key to '/etc/dropbear/dropbear_rsa_host_key'
Generating key, this may take a while...
Public key portion is:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgn5lkw3fu/QnSubMFkgebwuSzQUWK7cnnnpREYqqdyrnp5QIuAMpyrBVEYYPsd/3PrhIUVmh6LQoKcuJT6fjDG3TO0viKxZNA5tjjuR2+Ju/xzjiLyAnGKGke2Ou/29HxNjiRvRq6JdUxRQ6QnNS4Jz8oY+ZDvKSakvB7F0LWC39/0k= root@freescale
Fingerprint: md5 e6:ca:f3:af:be:30:17:0c:b3:b0:a1:ea:52:54:d3:7e
Starting the dropbear ssh server:
starting pid 2283, tty '': '/etc/rc.d/rc_gpu.S'
can't run '/etc/rc.d/rc_gpu.S': No such file or directory
starting pid 2284, tty '': '/sbin/getty -L ttyAM0 115200 vt100'

arm-none-linux-gnueabi-gcc (4.4.4_09.06.2010) 4.4.4
root filesystem built on Mon, 10 Jun 2013 13:35:42 +0300
Freescale Semiconductor, Inc.

freescale login:

Если вместо монтирования файловой системы возник Kernel Panic, скорее всего, при сборке ядра была неправильно указана командная строка. Прокручиваем лог в самый вверх и смотрим какая командная строка указана в данном ядре.

Для создания загрузочной SD карты в ОС Линукс можно воспользоваться скриптом mk_mx28_sd, который находится в папке /ltib: запись ядра и файловой системы:

sudo ./mk_mx28_sd.sh /dev/sdX  (Где sdX - имя вашей карты)

чтобы записать u-boot, необходимо добавить опцию -u

sudo ./mk_mx28_sd.sh -u /dev/sdX (Где sdX - имя вашей карты)

Скрипт создает на SD карте три партиции (обычно sdb1, sdb2, sdb3). sdb2 используется для хранения ядра, в sdb3 располагается файловая система.
Для собственных нужд мы немного переделали данный скрипт, он называется mk_mx28_sd_ev.sh. Данный скрипт создает три партиции на SD карте:
sdb1 - размер 16М, для хранения ядра
sdb2 - размер 256М, SWAP
sdb3 - оставшееся место - файловая система. Данная партиция отформатирована в ext4
Рекомендуется использовать SDHC карты объемом минимум 1 ГБ, лучше 2ГБ.

Загрузка по USB

Утилита sb_loader.exe позволяет быстро загрузить файл в RAM платы и запустить его. Порядок действий:

  1. DIP-SWITCH выставляет в режим загрузка по USB (0000)
  2. Подключаем USB кабель типа USBA-USBA к компьютеру и к плате (обязательно в порт USB0, т.к. USB1 не может работать в режиме Device)
  3. Подаем питание на плату

Запускаем:

sb_loader.exe -f imx28_ivt_uboot.sb

или

sb_loader.exe -f imx28_ivt_linux.sb

Утилита загрузит указанный файл и начнет выполнение. В запущенной терминальной программе можно увидеть лог выполнения.

Запись загрузчика, ядра и файловой системы в микросхемы SPI/NAND Flash по USB интерфейсу

Программа MFGTools (ОС Windows) позволяет упростить запись файлов в микросхемы SPI/NAND Flash модуля SE-iMX287-Micro
Для корректной работы ядра из микросхемы NAND Flash должно быть собрано с командной строкой

noinitrd console=ttyAM0,115200 ubi.mtd=1 root=ubi0:rootfs0 rootfstype=ubifs rw gpmi


Для корректной работы ядра из микросхемы SPI Flash должно быть собрано с командной строкой

setenv bootargs console=ttyAM0,115200 root=/dev/mtdblock4 rw rootfstype=jffs2 ip=none gpmi


Существуют следующие опции записи, которые выбираются в выпадающем списке Options-Configuration программы MFGTools
1. Load imx28_ivt_uboot.sb - Загрузить файл загрузчика в ОЗУ и выполнить его
2. Load imx28_ivt_linux.sb - Загрузить файл ядра в ОЗУ и выполнить его
3. SPI-Write All - запишет в микросхему SPI Flash загрузчик imx28_ivt_uboot.sb, ядро uImage и файловую систему rootfs.jffs2 (/dev/mtd2, /dev/mtd3/, /dev/mtd4/)
4. SPI-Write uboot - запишет в микросхему SPI Flash только загрузчик imx28_ivt_uboot.sb (том /dev/mtd2)
5. SPI-Write uImage - запишет в микросхему SPI Flash только ядро uImage (том /dev/mtd3)
6. SPI-Write rootfs - запишет в микросхему SPI Flash только ядро rootfs.jffs2 (том /dev/mtd4)
7. NAND-Write Linux&rootfs - запишет в микросхему NAND Flash ядро imx28_ivt_linux.sb и файловую систему rootfs.tar.bz2 (файловая система UBI)


В файле ucl.xml программы MFGTools можно посмотреть команды записи и создать собственные стратегии.

  1. Копируем файл ядра imx28_ivt_linux.sb и архив с файловой системой rootfs.tar.bz2 в папку \Mfgtools-Rel-1.6.2.0322\Profiles\MX28 Linux Update\OS Firmware\files\
  2. DIP-SWITCH выставляем в режим загрузки по USB (0000)
  3. Подключаем USB кабель типа USBA-USBA к компьютеру и к плате (обязательно в порт USB0, т.к. USB1 не может работать в режиме Device)
  4. Подключаем кабель к COM порту компьютера
  5. Запускаем терминальную программу
  6. Подаем питание на плату
  7. Запускаем программу MfgTool.exe (\Mfgtools-Rel-1.6.2.0322\MfgTool.exe)

Убеждаемся, что плата видна в системе:

Нажимаем Start.
В терминальной программе можно наблюдать лог загрузки и выполнение процесса записи. В зависимости от размера файловой система процесс записи может продолжатся до 10 минут.
Удачное окончание выполнения записи

Update Complete! - Запись успешно завершена, лог.

После успешного окончания записи отключаем питание, отключаем USB кабель и переводим DIP-SWITCH в режим загрузки с NAND Flash (0010) или SPI Flash (0100). Подаем питание, в терминальной программе должен пойти лог загрузки.

Запись ядра и файловой системы в микросхему NAND Flash в Линукс

Можно перезаписать ядро и файловую систему прямо в запущенной плате, при загруженном ядре Линукс. В файловой системе обязательно должны быть включены пакеты kobs-ng и mtd-util (убедитесь в этом при сборке файловой системы). Файлы, которые требуется записать (imx28_ivt_linux.sb и архив с файловой системой rootfs.tar.bz2) запишем на флешку.

  1. Подаем питание на плату, ждем окончания загрузки
  2. Подключаем флешку в USB порт, смотрим в логе ее имя
  1. Монтируем флешку
mount dev/sda4 /mnt (sda4 замените на ваше имя, /mnt - точка монтирования флешки)

Начинаем: Стираем партиции в NAND Flash:

flash_eraseall /dev/mtd0
flash_eraseall /dev/mtd1

Записываем новое ядро:

kobs-ng init /mnt/imx28_ivt_linux.sb

Подключаем ubi manager:

ubiattach /dev/ubi_ctrl -m 1

Создаем том rootfs0 размером 200 МБайт:

ubimkvol /dev/ubi0 -N rootfs0 -s 200MiB

Создаем директорию для монтирования rootfs:

mkdir /mnt/ubifs

Монтируем:

mount -t ubifs ubi0:rootfs0 /mnt/ubifs

Распаковываем архив с файловой системой:

tar -xvpf /mnt/rootfs.tar.bz2 -C /mnt/ubifs

Отмонтируем:

umount /mnt/ubifs

Запись ядра или загрузчика в SPI Flash с помощью u-boot

В некоторых случаях может оказаться обоснованным отказаться от микросхемы NAND Flash и хранить ядро или загрузчик в SPI Flash, а файловую систему разместить, например, на SD карте.
Что для этого потребуется:

  1. Собранный imx28_ivt_uboot.sb с поддержкой SPI Flash.
  2. сервис tftp (для Windows можно воспользоваться программой TFTPd32) нужен для загрузки файлов по сети.

Создаем загрузочную SD карту с загрузчиком. Вставляем карту в плату, выставляем режим загрузки с карты (1001), включаем плату. Стартует u-boot. Теперь необходимо загрузить на плату файл который мы хотим записать в SPI Flash (imx28_ivt_uboot.sb или imx28_ivt_linux.sb). Проще всего это сделать по сети, хотя можно загрузить и с USB Flash Drive. Рассмотрим как это сделать по сети: Нужный файл (imx28_ivt_uboot.sb или imx28_ivt_linux.sb) копируем в папку TFTPd32 (Windows) или tftpboot (Linux).
В запущенном u-boot необходимо выставить некоторые параметры:

setenv serverip 192.168.0.77 (укажите IP адрес компьютера на котором запущен tftp)
setenv ipaddr 192.168.0.88 (назначьте вашей плате IP адрес)
setenv ethaddr 11:22:33:44:55:66 (в некоторых случаях может понадобится назначить плате MAC адрес)
saveenv (сохраняем введенные параметры)

Подготавливаем микросхему SPI Flash:

sf probe 2:0
sf erase 0x0 0x800000

Теперь загружаем по tftp файл:

tftpboot 0x42000000 imx28_ivt_linux.sb (или imx28_ivt_uboot.sb)

И записываем его в микросхему SPI Flash:

sf write 0x42000000 0x0 0x42000

Отключаем питание платы, переводим DIP-SWITCH в режим загрузки с SPI Flash (0100), подаем питание. В терминальной программе видим лог загрузки. Система стартовала с SPI Flash.

Готовые архивы с файлами и утилитами

Для быстрой проверки работоспособности плат Вы можете воспользоваться готовыми образами загрузчика, ядра и файловой системы. В ядре включена поддержка:

Ядро
SDcard (SSP0)
USB0
USB1
Eth0
Eth1
NAND Flash
CAN0
CAN1
LCD (800*480)
DUART (отладочный)
AUART0
AUART1
AUART2
AUART3
AUART4
SPI (SSP2)
LED0 (Heartbeat), подключен к сигналу SSP0_DATA4
LED1 (отображает активность MMC), подключен к сигналу SSP0_DATA7
Аудиокодек

В файловую систему включены следующие пакеты:

Файловая система, пакеты
kobs-ng
uuc
alsa-utils
busybox
can4linux
cantest
dosftools
DirectFB
dropbear
fbset
fbv
gstreamer
i2c-tools
inetutils
minicom
mplayer
mp3play
mtd-utils
tslib
util-linux

Архив с ядром (imx28_ivt_linux.sb) и файловой системой (rootfs.ext2) и утилитой cfimager для записи на SD карту. **В *.bat файле в архиве отредактируйте имя диска**! Укажите имя, под которым карта видна на Вашем компьютере. (Требуется карта размером не менее 512 МБ).

Архив с загрузчиком (imx28_ivt_uboot.sb) и утилитой cfimager для записи на SD карту. **В *.bat файле в архиве отредактируйте имя диска**! Укажите имя, под которым карта видна на Вашем компьютере. (Требуется карта размером не менее 512 МБ).

Архив с ядром (imx28_ivt_linux.sb) и файловой системой Debian. На компьютере с OC Linux распакуйте архив, подключите карт-ридер с SD картой размером минимум 1ГБ, отмонтируйте все разделы карты и запустите скрипт mk_mx28_sd c root правами. Собранное ядро imx28_ivt_linux.sb находится в rootfs/boot/

sudo ./mk_mx28_sd /dev/sdb

Архив с ядром (imx28_ivt_linux.sb) и файловой системой (rootfs.ext2) и утилитой MFGTools для записи в микросхему NAND Flash.

Архив с ядром (imx28_ivt_linux.sb) для загрузки по USB. Запустите файл load_kernel.bat

Архив с загрузчиком (imx28_ivt_uboot.sb) для загрузки по USB. Запустите файл load_uboot.bat

Разумеется, вы можете заменять в данных архивах файлы ядра (imx28_ivt_linux.sb), загрузчика (imx28_ivt_uboot.sb) и файловой системы (rootfs.ext2, rootfs.tar.bz2) на свои, собранные Вами в процессе работы.

Разворачиваем сетевую файловую систему NFS

В процессе разработки, отладки ядра и файловой системы неудобно постоянно писать ядро, файловую систему на SD карту или в NAND Flash. Это занимает продолжительное время. Удобнее записать загрузчик в NAND или SPI Flash, далее загрузчик по TFTp загружает и запускает на выполнение ядро, а файловая система NFS (Network File Systemhttp://ru.wikipedia.org/wiki/Network_File_System) находится на сервере. Правда удобнее для этого использовать отдельный компьютер с операционной системой Linux. Скорее всего у Вас есть устаревший компьютер или ноутбук, который можно приспособить для данной цели. Настройки NFS сервера описаны достаточно подробно в сети Интернет. Двумя словами для Ubuntu: Устанавливаем

sudo apt-get install nfs-kernel-server nfs-common portmap

Все данные о совместном использовании папок хранятся в файле /etc/exports
Предположим, что наша rootfs будет располагаться в /tftpboot/ev-imx287/ Правим файл /etc/exports

sudo gedit /etc/exports

В появившемся редакторе пишем

/tftpboot/ev-imx287 *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)

Перезапускаем NFS сервер

sudo /etc/init.d/nfs-kernel-server restart

В дальнейшем, после правки конфигурационного файла достаточно

sudo exportfs -a

Настройка сервера закончена. Установим TFTP сервера (TFTP — простой протокол для передачи файлов по сети, использует протокол UDP (по порту 69), не поддерживает аутентификацию и шифрование).
…. Теперь настраиваем клиент (нашу плату).
После старта u-boot прерываем его загрузку нажатием любой кнопки клавиатуры и задаем переменные окружения (предположим, что IP адрес NFS сервера 192.168.0.101, IP адрес платы 192.168.0.151) :

EV-iMX287 Uboot >setenv ipaddr 192.168.0.151 (назначьте корректный IP адрес Вашей платы, согласно Вашей сети)
EV-iMX287 Uboot >setenv serverip 192.168.0.101 (укажите IP адрес компьютера, на котором запущен NFS сервер)
EV-iMX287 Uboot >setenv bootargs console=ttyAM0,115200n8 root=/dev/nfs ip=dhcp nfsroot=192.168.0.101:/tftpboot/ev-imx287,v3,tcp fec_mac=00:08:02:6B:A3:1A gpmi - укажите аргументы запуска ядра
EV-iMX287 Uboot >setenv bootcmd  'tftpboot 0x42000000 ev-imx287/boot/uImage; bootm 0x42000000' - команда загрузки и запуска ядра
EV-iMX287 Uboot >saveenv

Теперь, если перегрузить плату, u-boot загрузит по сети ядро uImage (т.к. в системе уже запущен загрузчик imx28_ivt_uboot.sb, то в настройке памяти и питания нет нужды. Поэтому используется ядро в elf формате, а не «обернутый» imx28_ivt_linux.sb) в память по адресу 0x42000000 и запустит его. После загрузки ядра будет произведено монтирования файловой системы NFS указанной в аргументах запуска ядра. Что в итоге - после пересборки ядра или файловой системы, на плате нажимаем сброс, загрузчик загружает (новое)ядро и монтирует (новую)файловую систему. На все уходит буквально несколько секунд.

Рекомендации по проектированию собственной материнской платы для модуля SE-IMX287-Micro

Никаких особенностей по сравнению с типовым созданием печатной платы нет, несколько замечаний о которых нужно помнить:

  1. Сигналы USB0_D_P+USB0_D_N, USB1_D_P+USB1_D_N, ETH0_RX_P+ETH0_RX_N, ETH0_TX_P+ETH0_TX_N представляют собой дифференциальные пары. Ведите их как дифф. пары, вдали от других сигналов. Расположите по дифф. парами земляной полигон или плэйн, не допускайте разрывы или пересечение другими сигналами земляного полигона или плэйна под дифф. сигналами.
  2. Если Вы планируете использовать интерфейс I2C1 - не забудьте предусмотреть подтягивающие резисторы (Интерфейс I2C0 подтянут резисторами, расположенными на модуле SE-IMX287-Micro)
  3. Предусмотрите возможность выбора источника загрузки процессора (с помощью DIP-переключателя или перемычками) подключив их к сигналам LCD_D0 - LCD_D3
  4. Предусмотрите подтяжку сигнала LCD_D4 к земле, для установки напряжения питания периферии модуля 3.3В
  5. Предусмотрите подтяжку сигнала LCD_RS к 3.3В, если Вы планируете выбирать источник загрузки процессора с помощью сигналов LCD_D0 - LCD_D3 (В процессоре имеется возможность прошить eFuse, которые определят источник загрузки, в этом случае DIP-переключатель не нужен)
  6. Обеспечьте качественное питание модуля напряжением 5В +-5%, предусмотрите в непосредственной близости от модуля конденсатор емкостью не менее 330 uF.
  7. Сигнал USB0_ID должен быть притянут к земле или к 3.3В через резистор 1kOm для установки режима Host/Device.
  8. Если Ваша плата имеет многочисленную периферию с напряжением питания 3.3В, предусмотрите отдельный источник напряжения LDO или DCDC для ее питания. Расположенный на модуле LDO TLV1117-33 с максимальным током 0,8А питает микросхему PHY Ethernet, которая может потреблять до 60 мА.
  9. Обязательно подключите сигналы ETH0_LED0 и ETH0_LED1, даже если вы не используете их в сетевом разъеме! Они задают режим работы микросхемы PHY Ethernet. Схема подключения показана ниже.
  10. Рекомендуемые ключи для коммутации питания USB - TPS2051 или аналогичные.

Управление GPIO выводами

Для управления GPIO выводами возможно с помощью Sysfs. Для того, чтобы управлять выводом микроконтроллера, необходимо, чтобы в BSP ему не была назначена ни одна функция.
Номер GPIO в i.MX28 вычисляется как Port*32+Pin_number, например GPIO2_12 соответствует 2*32+12 = 76.
Перед использованием делаем export

echo 76 > /sys/class/gpio/export

Теперь задаем направление работы вывода - выход

echo out > /sys/class/gpio/gpio76/direction

Теперь можно установить вывод в 1

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

или в 0

echo 0 > /sys/class/gpio/gpio76/value

Аналогично, конфигурируем на вход

root@ev-imx287:~# echo 76 > /sys/class/gpio/export
root@ev-imx287:~# echo in > /sys/class/gpio/gpio76/direction
root@ev-imx287:~# cat /sys/class/gpio/gpio76/value
0
root@ev-imx287:~#

Настройка USB GSM модема

Для того, чтобы модем SIM5320 определялся при подключении по USB, в ядре 2.6.35 необходимо добавить:

diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index 6e09857..e342660 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -750,6 +750,7 @@ static const struct usb_device_id option_ids[] = {
 	{ USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) },
 	{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */
 	{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
+	{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */
 	{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */
 	{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6008) },
 	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) },

Предварительно пересобрать ядро включив поддержку

Device Drivers  ---> USB Support --->
   [*] USB Serial Converter support --->
        [M] USB driver for GSM and CDMA modems

Device Drivers  ---> Network device support  --->
   [*] PPP (point-to-point protocol) support
   [*] PPP support for async serial ports
Device Drivers --> USB Support --->
   [*]  usb modem (CDC ACM )support

Запускаем wvdialconf:

root@ev-imx287:~# wvdialconf
Editing `/etc/wvdial.conf'.

Scanning your serial ports for a modem.

ttySP0<*1>: ATQ0 V1 E1 -- failed with 2400 baud, next try: 9600 baud
ttySP0<*1>: ATQ0 V1 E1 -- failed with 9600 baud, next try: 115200 baud
ttySP0<*1>: ATQ0 V1 E1 -- and failed too at 115200, giving up.
ttySP1<*1>: ATQ0 V1 E1 -- failed with 2400 baud, next try: 9600 baud
ttySP1<*1>: ATQ0 V1 E1 -- failed with 9600 baud, next try: 115200 baud
ttySP1<*1>: ATQ0 V1 E1 -- and failed too at 115200, giving up.
mxs-auart mxs-auart.2: Unhandled status 52028d
ttySP2<*1>: ATQ0 V1 E1 -- failed with 2400 baud, next try: 9600 baud
ttySP2<*1>: ATQ0 V1 E1 -- failed with 9600 baud, next try: 115200 baud
ttySP2<*1>: ATQ0 V1 E1 -- and failed too at 115200, giving up.
ttySP3<*1>: ATQ0 V1 E1 -- failed with 2400 baud, next try: 9600 baud
ttySP3<*1>: ATQ0 V1 E1 -- failed with 9600 baud, next try: 115200 baud
ttySP3<*1>: ATQ0 V1 E1 -- and failed too at 115200, giving up.
mxs-auart mxs-auart.4: Unhandled status 52028d
ttySP4<*1>: ATQ0 V1 E1 -- failed with 2400 baud, next try: 9600 baud
ttySP4<*1>: ATQ0 V1 E1 -- failed with 9600 baud, next try: 115200 baud
ttySP4<*1>: ATQ0 V1 E1 -- and failed too at 115200, giving up.
WvModem<*1>: Cannot get information for serial port.
ttyUSB0<*1>: ATQ0 V1 E1 -- OK
ttyUSB0<*1>: ATQ0 V1 E1 Z -- OK
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 -- OK
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 &C1 -- OK
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 -- OK
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK
ttyUSB0<*1>: Modem Identifier: ATI -- Manufacturer: huawei
ttyUSB0<*1>: Speed 9600: AT -- OK
ttyUSB0<*1>: Max speed is 9600; that should be safe.
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK
WvModem<*1>: Cannot get information for serial port.
ttyUSB1<*1>: ATQ0 V1 E1 -- failed with 2400 baud, next try: 9600 baud
ttyUSB1<*1>: ATQ0 V1 E1 -- failed with 9600 baud, next try: 9600 baud
ttyUSB1<*1>: ATQ0 V1 E1 -- and failed too at 115200, giving up.
WvModem<*1>: Cannot get information for serial port.
ttyUSB2<*1>: ATQ0 V1 E1 -- OK
ttyUSB2<*1>: ATQ0 V1 E1 Z -- OK
ttyUSB2<*1>: ATQ0 V1 E1 S0=0 -- OK
ttyUSB2<*1>: ATQ0 V1 E1 S0=0 &C1 -- OK
ttyUSB2<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 -- OK
ttyUSB2<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK
ttyUSB2<*1>: Modem Identifier: ATI -- Manufacturer: huawei
ttyUSB2<*1>: Speed 9600: AT -- OK
ttyUSB2<*1>: Max speed is 9600; that should be safe.
ttyUSB2<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK

Found a modem on /dev/ttyUSB0.
Modem configuration written to /etc/wvdial.conf.
ttyUSB0<Info>: Speed 9600; init "ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0"
ttyUSB2<Info>: Speed 9600; init "ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0"
root@ev-imx287:~#

Модем обнаружен /dev/ttyUSB0
Для файловой системы Debian закачиваем пакеты:

wget http://people.debian.org/~zumbi/tmp/eglibc+getcontext/eglibc-source_2.13-27.1_all.deb
wget http://people.debian.org/~zumbi/tmp/eglibc+getcontext/glibc-doc_2.13-27.1_all.deb
wget http://people.debian.org/~zumbi/tmp/eglibc+getcontext/locales_2.13-27.1_all.deb

И устанавливаем, без этого wvdial будет соединяться и через несколько секунд рызрывыать связь

dpkg -i eglibc-source_2.13-27.1_all.deb
dpkg -i glibc-doc_2.13-27.1_all.deb
dpkg -i locales_2.13-27.1_all.deb 

Теперь запускаем

wvdial

Если при попытке установить связь постоянно сыпятся ошибки

root@ev-imx287:~# wvdial
--> WvDial: Internet dialer version 1.61
--> Cannot get information for serial port.
--> Initializing modem.
--> Sending: ATZ
ATZ
OK
--> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
OK
--> Sending: AT+CGDCONT=1,"IP","3g.utel.ua"
AT+CGDCONT=1,"IP","3g.utel.ua"
OK
--> Modem initialized.
--> Sending: ATDT*99#
--> Waiting for carrier.
ATDT*99#
CONNECT 115200
--> Carrier detected.  Waiting for prompt.
--> Connected, but carrier signal lost!  Retrying...
--> Sending: ATDT*99#
--> Waiting for carrier.
--> Timed out while dialing.  Trying again.
--> Sending: ATDT*99#
--> Waiting for carrier.
--> Timed out while dialing.  Trying again.
--> Sending: ATDT*99#
--> Waiting for carrier.
--> Timed out while dialing.  Trying again.
--> Sending: ATDT*99#
--> Waiting for carrier.
--> Timed out while dialing.  Trying again.
--> Sending: ATDT*99#
--> Waiting for carrier.
--> Timed out while dialing.  Trying again.
--> Sending: ATDT*99#
--> Waiting for carrier.
--> Timed out while dialing.  Trying again.
--> Sending: ATDT*99#

Правим файл /etc/wvdial.conf, добавляем в него две строки:

Carrier Check = off 
Stupid Mode = on 

Для модема SIM5320E с украинским оператором Utel содержимое файла /etc/wvdial.conf выглядит следуюшим образом:

[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 
Init3 = AT+CGDCONT=1,"IP","3g.utel.ua"
Password = gdata 
Phone = *99#
Carrier Check = off
Stupid Mode = on
Modem Type = Analog Modem
Baud = 9600
New PPPD = yes
Modem = /dev/ttyUSB2
ISDN = 0
Username = gdata 

Теперь запускаем

wvdial

Набрав ifconfig убеждаемся, что у нас появился интерфейс ppp0:

root@ev-imx287:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:04:00:00:00:00
          inet addr:192.168.0.100  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1774 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2458 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:151225 (147.6 KiB)  TX bytes:557581 (544.5 KiB)
          Base address:0x8000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:36 errors:0 dropped:0 overruns:0 frame:0
          TX packets:36 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:3836 (3.7 KiB)  TX bytes:3836 (3.7 KiB)

ppp0      Link encap:Point-to-Point Protocol
          inet addr:37.52.229.155  P-t-P:10.64.64.64  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:21 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:820 (820.0 B)  TX bytes:1859 (1.8 KiB)

root@ev-imx287:~#

Настройка USB WiFi адаптера на чипе Realtek

Указав в makefile путь к ядру, компилятору и версию ядра собираем драйвер USB адаптера (8192.cu.ko).
Копируем его на плату:

scp 8192.cu.ko root@192.168.0.100:/home

На плате запускаем драйвер:

insmod /home/8192.cu.ko

Вставляем USB WiFi адаптер в свободный USB разъем:

На плате устанавливаем пакеты wireless-tools и wpasupplicant

apt-get install wireless-tools
apt-get install wpasupplicant

Рассмотрим подключение к сети с защитой WPA2.
В файл /etc/network/interfaces добавляем следующие строки:

auto wlan0
iface wlan0 inet dhcp
    wpa-ssid mynetworkname
    wpa-psk mysecretpassphrase

Где mynetworkname - SSID (имя) вашей сети, mysecretpassphrase - пароль вашей сети.
Если автозапуск при старте не нужен, строку auto wlan0 можно закомментировать.

Подключаемся к сети:

ifconfig wlan0 up ; поднимаем интерфейс
iwlist wlan0 scan ; посмотреть доступные сети
ifup wlan0 ; подключиться

Набрав ifconfig убеждаемся что беспроводная сеть доступна:

root@ev-imx287:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:04:00:00:00:00
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Base address:0x8000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

wlan0     Link encap:Ethernet  HWaddr e8:4e:06:09:c8:17
          inet addr:192.168.0.106  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:187 errors:0 dropped:191 overruns:0 frame:0
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:42142 (41.1 KiB)  TX bytes:1398 (1.3 KiB)


root@ev-imx287:~# ping otladka.com.ua
PING otladka.com.ua (91.200.40.47) 56(84) bytes of data.
64 bytes from h47.hvosting.ua (91.200.40.47): icmp_req=1 ttl=58 time=6.71 ms
64 bytes from h47.hvosting.ua (91.200.40.47): icmp_req=2 ttl=58 time=6.53 ms
64 bytes from h47.hvosting.ua (91.200.40.47): icmp_req=3 ttl=58 time=11.1 ms
--- otladka.com.ua ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 6.532/8.146/11.188/2.153 ms
root@ev-imx287:~#

Аппаратные часы реального времени

На некоторых платах (EV-iMX287-Mini) предусмотрена возможность установки микросхемы PCF8563 с держателем литиевой батареи CR1220.
Чтобы добавить в ядро поддержку данной RTC необходимо сделать следующее:
В борд файле платы mx28evk.c добавить строку { I2C_BOARD_INFO(«pcf8563»,0x51) },

static struct i2c_board_info __initdata mxs_i2c_device[] = {
        { I2C_BOARD_INFO("sgtl5000-i2c", 0xa), .flags = I2C_M_TEN },
        { I2C_BOARD_INFO("pcf8563",0x51) },
        { I2C_BOARD_INFO("at24", 0x52) },
        { I2C_BOARD_INFO("si7005-i2c", 0x40)},
};

В menuconfig ядра зайти в Device Drivers → Real Time Clock и установить Philips PCF8563
Пересобираем ядро, загружаем в плату. Убеждаемся что чип найден

root /root # dmesg | grep -i pcf
rtc-pcf8563 0-0051: chip found, driver version 0.4.3
rtc-pcf8563 0-0051: rtc core: registered rtc-pcf8563 as rtc0
rtc-pcf8563 0-0051: setting system clock to 2013-09-12 13:34:42 UTC (1378992882)
root /root #

Выполняем команду

root /root # hwclock -r
Thu Sep 12 13:46:43 2013  -0.637157 seconds
root /root #

Если появляются сообщения

rtc-pcf8563 0-0051: low voltage detected, date/time is not reliable.
rtc-pcf8563 0-0051: low voltage detected, date/time is not reliable.
rtc-pcf8563 0-0051: low voltage detected, date/time is not reliable.

На них не обращаем внимание, это значит что время не установлено.
Устанавливаем время

root /root # date MMDDhhmmCCYY.ss

MM — месяц, DD — день месяца, hh — часы, mm — минуты, CCYY — 4 цифры года, ss — секунды
Например, чтобы установить 12 сентября 2013 года 13:34 набираем

root /root # date 091213342013
Thu Sep 12 13:34:00 UTC 2013
root /root #

Теперь выполним команду

root /root # hwclock -w

Устанавливаем батарейку в держатель, отключаем питание, подключаем, убеждаемся, что часы идут верно.

Собираем OpenWRT

Для желающих попробовать OpenWRT. Его можно запустить на той же виртуальной машине, которая доступна для загрузки. Порядок действий:
1. Загружаем архив openwrt_mx28.tar.bz2
2. Копируем его, например, в /home/evodbg/Projects/ev-imx287
3. Разархивируем

evodbg@evodbg:`/Projects/ev-imx287$ tar xvjf openwrt_mx28.tar.bz2

4. Загружаем архив dl.tar.bz2 в папку openwrt (это всякие пакеты, чтобы не при сборке они не тянулись с интернета)
5. Разархивируем

evodbg@evodbg:`/Projects/ev-imx287/openwrt$ tar xjvf dl.tar.bz2

6. Находясь в папке openwrt набираем

evodbg@evodbg:`/Projects/ev-imx287/openwrt$ make

Ждем, в зависимости от производительности компьютера сборка может идти долго. Результатом сборки в папке openwrt/bin/mx28 будут следующие файлы:
openwrt-mx28-uImage - собранное ядро, пригодное для загрузки по сети
openwrt-imx28-evk.dtb - собранный dts файл платы, тоже пригодится для загрузки по сети

Запускаем u-boot, задаем ему следующие параметры окружения:

setenv serverip xxx.xxx.xxx.xxx   адрес сервера, откуда будем загружать
setenv ipaddr xxx.xxx.xxx.xxx  назначаем адрес плате
setenv ethaddr xx:xx:xx:xx:xx:xx  при первом запуске придется назначить MAC адрес
setenv bootargs console=ttyAMA0,115200 root=/dev/mmcblk0p3 rw rootwait ip=dhcp gpmi  - командная строка (в данном случае rootfs на SD карте)
setenv bootcmd 'tftp 0x42000000 openwrt-mx28-uImage; tftp 0x41000000 openwrt-imx28-evk.dtb; bootm 0x42000000 - 0x41000000' 
saveenv
res

После перезагрузки платы, u-boot по сети загрузит файлы openwrt-mx28-uImage и openwrt-imx28-evk.dtb и запустит ядро. Разумеется, перед этим, файловую систему (rootfs) надо положить на SD карту.

Configured for 5v only power source.            Battery powered operation disabled.
LLLCJul 17 201314:51:18
FRAC 0x92925552
memory type is DDR2
                   Wait for ddr ready 1power 0x00820710
1311 Frac 0x92925552
start change cpu freq
hbus 0x00000003
cpu 0x00010001
start test memory accress
ddr2 0x40000000
finish simple test
LLLLLLLFLCLLJUncompressing Linux... done, booting the kernel.
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 3.9.11 (rusar@v1310) (gcc version 4.6.3 20120201 (prerelease) (Linaro GCC 4.6-2012.02) ) #17 Thu Oct 24 16:14:38 EEST 2013
[    0.000000] CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
[    0.000000] CPU: VIVT data cache, VIVT instruction cache
[    0.000000] Machine: Freescale i.MX28 (Device Tree), model: Freescale i.MX28 Evaluation Kit
[    0.000000] Memory policy: ECC disabled, Data cache writeback
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 32512
[    0.000000] Kernel command line: -e setenv bootargs console=ttyAMA0,115200 root=/dev/mmcblk0p3 rw rootwait ip=none gpmi
[    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] __ex_table already sorted, skipping sort
[    0.000000] Memory: 128MB = 128MB total
[    0.000000] Memory: 124152k/124152k available, 6920k 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 - 0xc050e7cc   (5146 kB)
[    0.000000]       .init : 0xc050f000 - 0xc0532c7c   ( 144 kB)
[    0.000000]       .data : 0xc0534000 - 0xc055e480   ( 170 kB)
[    0.000000]        .bss : 0xc055e480 - 0xc058fc50   ( 198 kB)
[    0.000000] SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] NR_IRQS:16 nr_irqs:16 16
[    0.000000] of_irq_init: children remain, but no parents
[    0.000000] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 178956ms
[    0.000000] Console: colour dummy device 80x30
[    0.000501] Calibrating delay loop... 226.09 BogoMIPS (lpj=1130496)
[    0.080201] pid_max: default: 32768 minimum: 301
[    0.080470] Mount-cache hash table entries: 512
[    0.081694] CPU: Testing write buffer coherency: ok
[    0.082434] Setting up static identity map for 0xc03b9f98 - 0xc03b9ff0
[    0.084922] devtmpfs: initialized
[    0.086201] pinctrl core: initialized pinctrl subsystem
[    0.086858] regulator-dummy: no parameters
[    0.087304] NET: Registered protocol family 16
[    0.088609] DMA: preallocated 256 KiB pool for atomic coherent allocations
[    0.112515] Serial: AMBA PL011 UART driver
[    0.112964] 80074000.serial: ttyAMA0 at MMIO 0x80074000 (irq = 230) is a PL011 rev2
[    0.357450] console [ttyAMA0] enabled
[    0.371342] bio: create slab <bio-0> at 0
[    0.379272] mxs-dma 80004000.dma-apbh: initialized
[    0.387232] mxs-dma 80024000.dma-apbx: initialized
[    0.393052] 3P3V: 3300 mV
[    0.396298] usb0_vbus: 5000 mV
[    0.399933] usb1_vbus: 5000 mV
[    0.404285] SCSI subsystem initialized
[    0.408693] usbcore: registered new interface driver usbfs
[    0.414451] usbcore: registered new interface driver hub
[    0.420149] usbcore: registered new device driver usb
[    0.429966] pps_core: LinuxPPS API ver. 1 registered
[    0.434955] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    0.444249] PTP clock support registered
[    0.448838] Advanced Linux Sound Architecture Driver Initialized.
[    0.456400] Switching to clocksource mxs_timer
[    0.486682] NET: Registered protocol family 2
[    0.492550] TCP established hash table entries: 1024 (order: 1, 8192 bytes)
[    0.499587] TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
[    0.506080] TCP: Hash tables configured (established 1024 bind 1024)
[    0.512806] TCP: reno registered
[    0.516088] UDP hash table entries: 256 (order: 0, 4096 bytes)
[    0.522051] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[    0.528890] NET: Registered protocol family 1
[    0.534076] RPC: Registered named UNIX socket transport module.
[    0.540026] RPC: Registered udp transport module.
[    0.544832] RPC: Registered tcp transport module.
[    0.549554] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    0.556480] NetWinder Floating Point Emulator V0.97 (double precision)
[    0.590504] NFS: Registering the id_resolver key type
[    0.595804] Key type id_resolver registered
[    0.600015] Key type id_legacy registered
[    0.604199] jffs2: version 2.2. (NAND) б╘ 2001-2006 Red Hat, Inc.
[    0.611835] msgmni has been set to 242
[    0.618973] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 250)
[    0.626498] io scheduler noop registered (default)
[    0.654548] Console: switching to colour frame buffer device 100x30
[    0.674552] mxsfb 80030000.lcdif: initialized
[    0.679737] uart-pl011 80074000.serial: no DMA platform data
[    0.686122] 8006a000.serial: ttyAPP0 at MMIO 0x8006a000 (irq = 215) is a 8006a000.serial
[    0.694962] mxs-auart 8006a000.serial: Found APPUART 3.1.0
[    0.700809] 8006c000.serial: ttyAPP1 at MMIO 0x8006c000 (irq = 218) is a 8006c000.serial
[    0.709628] mxs-auart 8006c000.serial: Found APPUART 3.1.0
[    0.715602] 8006e000.serial: ttyAPP2 at MMIO 0x8006e000 (irq = 221) is a 8006e000.serial
[    0.724509] mxs-auart 8006e000.serial: Found APPUART 3.1.0
[    0.730371] 80070000.serial: ttyAPP3 at MMIO 0x80070000 (irq = 224) is a 80070000.serial
[    0.739236] mxs-auart 80070000.serial: Found APPUART 3.1.0
[    0.745169] 80072000.serial: ttyAPP4 at MMIO 0x80072000 (irq = 227) is a 80072000.serial
[    0.754001] mxs-auart 80072000.serial: Found APPUART 3.1.0
[    0.760119] at24 0-0050: 128 byte 24c01 EEPROM, writable, 32 bytes/write
[    0.770090] ONFI param page 0 valid
[    0.773685] ONFI flash detected
[    0.776868] NAND device: Manufacturer ID: 0x01, Chip ID: 0xda (AMD/Spansion S34ML02G1), 256MiB, page size: 2048, OOB size: 64
[    0.788341] Scanning device for bad blocks
[    1.189605] gpmi-nand 8000c000.gpmi-nand: driver registered.
[    1.212702] m25p80 spi32766.0: mx25l6405d (8192 Kbytes)
[    1.336880] libphy: fec_enet_mii_bus: probed
[    1.344739] usbcore: registered new interface driver asix
[    1.350316] usbcore: registered new interface driver ax88179_178a
[    1.356711] usbcore: registered new interface driver cdc_ether
[    1.362849] usbcore: registered new interface driver smsc95xx
[    1.368813] usbcore: registered new interface driver net1080
[    1.374736] usbcore: registered new interface driver cdc_subset
[    1.380810] usbcore: registered new interface driver zaurus
[    1.386750] usbcore: registered new interface driver cdc_ncm
[    1.392511] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    1.399055] Initializing USB Mass Storage driver...
[    1.404213] usbcore: registered new interface driver usb-storage
[    1.410234] USB Mass Storage support registered.
[    1.415553] imx_usb 80080000.usb: pinctrl get/select failed, err=-19
[    1.423004] ci_hdrc ci_hdrc.0: doesn't support gadget
[    1.428114] ci_hdrc ci_hdrc.0: EHCI Host Controller
[    1.433318] ci_hdrc ci_hdrc.0: new USB bus registered, assigned bus number 1
[    1.451072] ci_hdrc ci_hdrc.0: USB 2.0 started, EHCI 1.00
[    1.458322] hub 1-0:1.0: USB hub found
[    1.462249] hub 1-0:1.0: 1 port detected
[    1.466954] imx_usb 80090000.usb: pinctrl get/select failed, err=-19
[    1.474394] ci_hdrc ci_hdrc.1: doesn't support gadget
[    1.479504] ci_hdrc ci_hdrc.1: EHCI Host Controller
[    1.484612] ci_hdrc ci_hdrc.1: new USB bus registered, assigned bus number 2
[    1.511069] ci_hdrc ci_hdrc.1: USB 2.0 started, EHCI 1.00
[    1.518032] hub 2-0:1.0: USB hub found
[    1.521974] hub 2-0:1.0: 1 port detected
[    1.527212] mousedev: PS/2 mouse device common for all mice
[    1.533058] rtc-pcf8563 0-0051: chip found, driver version 0.4.3
[    1.540587] rtc-pcf8563 0-0051: low voltage detected, date/time is not reliable.
[    1.548098] rtc-pcf8563 0-0051: retrieved date/time is not valid.
[    1.554800] rtc-pcf8563 0-0051: rtc core: registered rtc-pcf8563 as rtc0
[    1.565680] stmp3xxx-rtc 80056000.rtc: rtc core: registered 80056000.rtc as rtc1
[    1.573463] i2c /dev entries driver
[    1.611031] mxs-mmc 80010000.ssp: initialized
[    1.618294] usbcore: registered new interface driver usbhid
[    1.624014] usbhid: USB HID core driver
[    1.631870] mxs-lradc 80050000.lradc: Touchscreen not enabled.
[    1.649542] sgtl5000 0-000a: Failed to get supply 'VDDD': -517
[    1.655905] 0-000a: 1200 mV normal
[    1.659883] sgtl5000 0-000a: Using internal LDO instead of VDDD
[    1.677787] mmc0: host does not support reading read-only switch. assuming write-enable.
[    1.702925] mmc0: new high speed SD card at address b368
[    1.721018] mmcblk0: mmc0:b368 00000 954 MiB
[    1.728023]  mmcblk0: p1 p2 p3
[    5.700965] sgtl5000 0-000a: Device with ID register ffff is not a sgtl5000
[    7.721144] sgtl5000 0-000a: ASoC: failed to probe CODEC -19
[    7.726908] mxs-sgtl5000 sound.9: ASoC: failed to instantiate card -19
[    7.733649] mxs-sgtl5000 sound.9: snd_soc_register_card failed (-19)
[    7.740826] TCP: cubic registered
[    7.744488] NET: Registered protocol family 17
[    7.749220] Key type dns_resolver registered
[    7.755141] registered taskstats version 1
[    7.763611] rtc-pcf8563 0-0051: low voltage detected, date/time is not reliable.
[    7.771136] rtc-pcf8563 0-0051: retrieved date/time is not valid.
[    7.777255] rtc-pcf8563 0-0051: hctosys: invalid date/time
[    7.786872] ALSA device list:
[    7.789870]   No soundcards found.
[    7.814206] VFS: Mounted root (ext2 filesystem) on device 179:3.
[    7.823779] devtmpfs: mounted
[    7.827584] Freeing init memory: 140K
init started: BusyBox v1.19.4 (2013-10-14 10:23:03 EEST)
Initializing random number generator... done.
Starting network...
[    9.000263] eth0: Freescale FEC PHY driver [SMSC LAN8710/LAN8720] (mii_bus:phy_addr=800f0000.etherne:00, irq=-1)
udhcpc (v1.19.4) started
Sending discover...
[   10.991457] libphy: 800f0000.etherne:00 - Link is Up - 100/Full
Sending discover...
Sending select for 192.168.0.104...
Lease of 192.168.0.104 obtained, lease time 7200
Starting dropbear sshd: generating rsa key... generating dsa key... OK

(none) login: root
Jan  1 00:00:21 login[82]: root login on 'ttyAMA0'


BusyBox v1.19.4 (2013-10-14 10:23:03 EEST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 ATTITUDE ADJUSTMENT (%C, %R)
 -----------------------------------------------------
  * 1/4 oz Vodka      Pour all ingredients into mixing
  * 1/4 oz Gin        tin with ice, strain into glass.
  * 1/4 oz Amaretto
  * 1/4 oz Triple sec
  * 1/4 oz Peach schnapps
  * 1/4 oz Sour mix
  * 1 splash Cranberry juice
 -----------------------------------------------------
root@(none):~#

Можно расположить ядро и файловую систему на SD карте и загружать ядро с карты.
Загружаем архив elf2sb.tar.bz2. Распаковываем его в /openwrt/tools
В корень openwrt копируем два скрипта make_sb_file.sh и make_sd_card.sh. В папку /openwrt/staging_dir/target-arm_v5te_uClibc-0.9.33.2_eabi/ копируем скрипты mk_hdr.sh и mk_mx28_sd.
Делаем скрипты исполняемыми:

chmod +x make_sb_file.sh
chmod +x make_sd_card.sh

После того, как make удачно завершился, запускаем скрипт make_sb_file.sh. Он выполняет следующее - «склеивает» файлы openwrt-mx28-zImage и openwrt-imx28-evk.dtb. Затем с помощью утилиты elftosb добавляет к ним инициализацую памяти, питания и командную строку и на выходе выдает файл imx28_ivt_linux.sb. Скрипт make_sd_card.sh выполняет следующие действия - создает папку /boot в собранной файловой системе ( /openwrt/staging_dir/target-arm_v5te_uClibc-0.9.33.2_eabi/root-mx28), копирует в эту папку файл ядра imx28_ivt_linux.sb и записывает на ядро и файловую систему на SD карту с помощью скрипта mk_mx28_sd. Перед запуском make_sd_card.sh убедитесь, что ваша SD карта имеет имя sdb. Иначе поправьте имя в скрипте make_sd_card.sh на ваше.

dmesg
[190556.968190] usb 2-1: new high speed USB device using ehci_hcd and address 6
[190557.116232] usb 2-1: configuration #1 chosen from 1 choice
[190557.118077] scsi8 : SCSI emulation for USB Mass Storage devices
[190557.118340] usb-storage: device found at 6
[190557.118346] usb-storage: waiting for device to settle before scanning
[190562.116662] usb-storage: device scan complete
[190562.123248] scsi 8:0:0:0: Direct-Access     Generic- Multi-Card       1.00 PQ: 0 ANSI: 0 CCS
[190562.124947] sd 8:0:0:0: Attached scsi generic sg1 type 0
[190562.713188] sd 8:0:0:0: [sdb] 1953792 512-byte logical blocks: (1.00 GB/954 MiB)
[190562.714037] sd 8:0:0:0: [sdb] Write Protect is off
[190562.714044] sd 8:0:0:0: [sdb] Mode Sense: 03 00 00 00
[190562.714051] sd 8:0:0:0: [sdb] Assuming drive cache: write through
[190562.718144] sd 8:0:0:0: [sdb] Assuming drive cache: write through
[190562.718154]  **sdb: sdb1 sdb2 sdb3**

отмонтируйте карту

umount /dev/sdb1
umount /dev/sdb2
umount /dev/sdb3

Запустите скрипт make_sd_card.sh. Ответьте yes на вопрос о записи. После записи, вставьте карту в плату, установите режим загрузки дип переключателями 1001 и подайте питание. Система должна загрузиться и смонтироваться.

Микросхема MLC NAND Flash памяти H27UAG8T2A

На некоторых платах EV-iMX287-Mini может быть установлена микросхема NAND Flash Hynix H27UAG8T2A объемом 2 Гбайта. С данной памятью мы использовали ядро 3 версии. Для записи в нее ядра и файловой системы можно использовать следующую методику: 1. Создаем загрузочную SD карту с ядром 3 версии и файловой системой. 2. Записываем на нее файлы ядра и архив файловой системы, которую желаем расположить в NAND Flash 3. Загружаемся с SD карты. Выполняем:

flash_eraseall /dev/mtd0 стираем партицию mtd0
kobs-ng init /home/imx28_ivt_linux.sb записываем туда ядро
flash_eraseall /dev/mtd1  стираем партицию mtd1 
ubiattach /dev/ubi_ctrl -d 0 -m 1
ubimkvol /dev/ubi0 -N rootfs0 -m
mkdir -p /mnt/ubi0
mount -t ubifs ubi0_0 /mnt/ubi0
tar xvf /home/rootfs.tar -C /mnt/ubi0 распаковываем туда файловую систему
sync
sync
umount /mnt/ubi0 отмонтируем

Устанавливаем дип переключатели в режим загрузки с NAND Flash (0010) и подаем питание. Теперь система должна стартовать из NAND Flash. Подсказка: в 3 ядре используется командная строка console=ttyAMA0 вместо ttyAM0 как во 2.

Использование планировщика cron

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

mkdir /var/spool/cron/
mkdir /var/spool/cron/crontabs/
crontab -e

После выполнения последней команды запуститься редактор vi
Впишем задание - запускать скрипт script.sh, который лежит в /home

*/5 * * * * /home/script.sh

Чтобы сохранить изменения и выйти из редактора нажимаем Esc, затем : (двоеточие), w,q, кнопку Enter
Теперь каждые 5 минут будет запускаться на выполнение script.sh

Опять про создание *.sb файлов

Теперь воспользуемся утилитой elftosb. Для создания загрузочного образа ядра создадим папку и скопируем в нее следующие файлы - boot_prep, power_prep, linux_prep, zImage и linux_ivt.bd. Отредактируем файл linux_ivt.bd указав в нем расположение файлов boot_prep, power_prep, linux_prep, zImage. Все вышеперечисленные файлы можно найти в директории ltib или в этом архиве. Запустим утилиту elftosb:

elftosb -z -f imx28 -c ./linux_ivt.bd -o imx28_ivt_linux.sb

Сгенерированный файл imx28_ivt_linux.sb можно записать на SD карту или в NAND Flash как уже было описано выше и использовать для загрузки.

Список литературы

ev-imx287-micro.txt · Последние изменения: 2013/12/11 20:06 — evodbg
Recent changes RSS feed Debian Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki