Модуль EV-iMX287-Micro
Вся нижеописанное относится к платам построенным на процессоре i.MX287(i.MX283/i.MX285/i.MX280) такими как EV-iMX287, EV-iMX287-Mini, SE-iMX287-Micro.
Руководство пользователя модуля SE-iMX287-Micro (Rus) (версия 1.1 14/07/2013 1.7 МБ)
Принципиальная схема модуля (Rev 1.3)
SE-iMX287-Micro Product Brief Rus (1.5 МБ)
EV-iMX287-MB-Mini Product Brief Rus (1.5 МБ)
Принципиальная схема материнской платы EV-iMX287-MB-MINI в формате pdf.
Проект (схема и плата) в Altium Designer. (2.0 МБ)
Утилита PinMux для назначения выводов процессора
Утилита для программирования eFuse процессора
Растущие требования к электронной аппаратуре все чаще склоняют разработчиков к применению операционной системы Linux. Наличие готовых драйверов под огромное количество периферии, наличие готовых стеков USB, TCP и т.п. значительно сокращают время выхода готового изделия на рынок. Мы предлагаем Вашему вниманию малогабаритный модуль SE-iMX287-Micro с процессором семейства i.MX28.
Модуль 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 класса.
Габаритные размеры 50*40*10 мм.
Масса - 15 гр.
Напряжение питания 5В +-5%
Номинальный ток потребления - 250 мА
Рабочая температура для модуля с процессором i.MX287 -40…+85C
Рабочая температура для модуля с процессором i.MX283 -20…+85C
Температура хранения -55…+85С
Номер вывода | Наименование вывода | MUX1 | MUX2 | MUX3 | GPIO | Вывод CPU |
---|---|---|---|---|---|---|
1 | SSP0_DATA2 | SSP0_DATA2 | GPIO2_2 | D6 | ||
2 | SSP0_DETECT | SSP0_CARD_DET | GPIO2_9 | D10 | ||
3 | SSP0_SCK | SSP0_SCK | GPIO2_10 | A6 | ||
4 | SSP0_DATA1 | SSP0_DATA1 | GPIO2_1 | C6 | ||
5 | SSP0_DATA3 | SSP0_DATA3 | GPIO2_3 | A5 | ||
6 | SSP0_DATA0 | SSP0_DATA0 | GPIO2_0 | B6 | ||
7 | SSP0_CMD | SSP0_CMD | GPIO2_8 | A4 | ||
8 | LCD_RESET | LCD_RESET | LCD_VSYNC | GPIO3_30 | M6 | |
9 | LCD_D03 | LCD_D3 | ETM_DA8 | ETM_DA3 | GPIO1_3 | L3 |
10 | LCD_D01 | LCD_D1 | ETM_DA1 | GPIO1_1 | K3 | |
11 | LCD_RS | LCD_RS | LCD_DOTCLK | GPIO1_26 | M4 | |
12 | LCD_D05 | LCD_D5 | ETM_DA5 | GPIO1_5 | M3 | |
13 | LCD_ENABLE | LCD_ENABLE | GPIO1_31 | N5 | ||
14 | LCD_WR_RWN | LCD_WR_RWN | LCD_HSYNC | ETM_TCLK | GPIO1_25 | K1 |
15 | LCD_VSYNC | LCD_VSYNC | SAIF1_SDATA0 | GPIO1_28 | L1 | |
16 | LCD_D00 | LCD_D0 | ETM_DA0 | GPIO1_0 | K2 | |
17 | LCD_HSYNC | LCD_HSYNC | SAIF1_SDATA1 | ETM_TCTL | GPIO1_29 | M1 |
18 | LCD_D02 | LCD_D2 | ETM_DA2 | GPIO1_2 | L2 | |
19 | LCD_D04 | LCD_D4 | ETM_DA9 | ETM_DA4 | GPIO1_4 | M2 |
20 | LCD_DOTCLK | LCD_DOTCLK | SAIF1_MCLK | ETM_TCLK | GPIO1_30 | N1 |
21 | LCD_D06 | LCD_D6 | ETM_DA6 | GPIO1_6 | N2 | |
22 | LCD_D07 | LCD_D7 | ETM_DA7 | GPIO1_7 | P1 | |
23 | LCD_D08 | LCD_D8 | ETM_DA3 | ETM_DA8 | GPIO1_8 | P2 |
24 | LCD_D10 | LCD_D10 | ETM_DA10 | GPIO1_10 | R1 | |
25 | LCD_D11 | LCD_D11 | ETM_DA11 | GPIO1_11 | R2 | |
26 | LCD_D12 | LCD_D12 | ETM_DA12 | GPIO1_12 | T1 | |
27 | LCD_D13 | LCD_D13 | ETM_DA13 | GPIO1_13 | T2 | |
28 | LCD_D14 | LCD_D14 | ETM_DA14 | GPIO1_14 | U2 | |
29 | LCD_D09 | LCD_D9 | ETM_DA4 | ETM_DA9 | GPIO1_9 | P3 |
30 | LCD_D17 | LCD_D17 | ETM_DA6 | GPIO1_17 | R3 | |
31 | LCD_D16 | LCD_D16 | ETM_DA7 | GPIO1_16 | T3 | |
32 | LCD_D15 | LCD_D15 | ETM_DA15 | GPIO1_15 | U3 | |
33 | LCD_RD_E | LCD_RD_E | LCD_VSYNC | ETM_TCTL | GPIO1_24 | P4 |
34 | LCD_D20 | LCD_D20 | EN-ET1_1588_EVENT2_OUT | ETM_DA3 | GPIO1_20 | R4 |
35 | LCD_D19 | LCD_D19 | ETM_DA4 | GPIO1_19 | T4 | |
36 | LCD_D18 | LCD_D18 | ETM_DA5 | GPIO1_18 | U4 | |
37 | LCD_CS | LCD_CS | LCD_ENABLE | GPIO1_27 | P5 | |
38 | LCD_D23 | LCD_D23 | EN-ET1_1588_EVENT3_IN | ETM_DA0 | GPIO1_23 | R5 |
39 | LCD_D22 | LCD_D22 | EN-ET1_1588_EVENT3_OUT | ETM_DA1 | GPIO1_22 | T5 |
40 | LCD_D21 | LCD_D21 | EN-ET1_1588_EVENT2_IN | ETM_DA2 | GPIO1_21 | U5 |
41 | SSP2_MISO | SSP2_D0 | AUART3_RX | SAIF1_SDATA1 | GPIO2_18 | B3 |
42 | SSP2_SCK | SSP2_SCK | AUART2_RX | SAIF0_SDATA1 | GPIO2_16 | A3 |
43 | SSP3_MISO | SSP3_D0 | AUART4_RTS | EN-ET1_1588_EVENT1_OUT | GPIO2_26 | B2 |
44 | SSP3_SCK | SSP3_SCK | AUART4_TX | EN-ET1_1588_EVENT0_OUT | GPIO2_24 | A2 |
45 | SSP2_MOSI | SSP2_CMD | AUART2_TX | SAIF0_SDATA2 | GPIO2_17 | C3 |
46 | SSP1_SCK | SSP1_SCK | SSP2_D1 | EN-ET0_1588_EVENT2_OUT | GPIO2_12 | B1 |
47 | SSP3_MOSI | SSP3_CMD | AUART4_RX | EN-ET1_1588_EVENT0_IN | GPIO2_25 | C2 |
48 | SSP1_CMD | SSP1_CMD | SSP2_D2 | EN-ET0_1588_EVENT2_IN | GPIO2_13 | C1 |
49 | SSP2_SS1 | SSP2_D4 | SSP2_D1 | USB1_OVERCURRENT | GPIO2_20 | D3 |
50 | SSP3_SS0 | SSP3_D3 | AUART4_CTS | EN-ET1_1588_EVENT1_IN | GPIO2_27 | D2 |
51 | SSP1_DATA0 | SSP1_D0 | SSP2_D6 | EN-ET0_1588_EVENT3_OUT | GPIO2_14 | D1 |
52 | SSP0_DATA6 | SSP0_D6 | SSP2_CMD | GPIO2_6 | D5 | |
53 | SSP0_DATA5 | SSP0_D5 | SSP2_D3 | GPIO2_5 | C5 | |
54 | SSP0_DATA4 | SSP0_D4 | SSP2_D0 | GPIO2_4 | B5 | |
55 | SSP0_DATA7 | SSP0_D7 | SSP2_SCK | GPIO2_7 | B4 | |
56 | SSP2_SS2 | SSP2_D5 | SSP2_D2 | USB0_OVERCURRENT | GPIO2_21 | D4 |
57 | GPMI_D06 | GPMI_D6 | SSP1_D6 | GPIO0_6 | U6 | |
58 | SSP1_DATA3 | SSP1_D3 | SSP2_D7 | EN-ET0_1588_EVENT3_IN | GPIO2_15 | E1 |
59 | GPMI_D07 | GPMI_D7 | SSP1_D7 | GPIO0_7 | T6 | |
60 | GPMI_D05 | GPMI_D5 | SSP1_D5 | GPIO0_5 | R7 | |
61 | GPMI_D04 | GPMI_D4 | SSP1_D4 | GPIO0_4 | T7 | |
62 | GPMI_D03 | GPMI_D3 | SSP1_D3 | GPIO0_3 | U7 | |
63 | GPMI_D01 | GPMI_D1 | SSP1_D1 | GPIO0_1 | T8 | |
64 | GPMI_D02 | GPMI_D2 | SSP1_D2 | GPIO0_2 | R8 | |
65 | GPMI_CLE | GPMI_CLE | SSP3_D2 | SSP3_D5 | GPIO0_27 | P7 |
66 | GPMI_D00 | GPMI_D0 | SSP1_D0 | GPIO0_0 | U8 | |
67 | GPMI_WRN | GPMI_WRN | SSP1_SCK | GPIO0_25 | P8 | |
68 | GPMI_RDN | GPMI_RDN | SSP3_SCK | GPIO0_24 | R6 | |
69 | GPMI_RDY1 | GPMI_READY1 | SSP1_CMD | GPIO0_21 | N8 | |
70 | GPMI_ALE | GPMI_ALE | SSP3_D1 | SSP3_D4 | GPIO0_26 | P6 |
71 | GPMI_CE1N | GPMI_CE1N | SSP3_D3 | GPIO0_17 | N9 | |
72 | ENET0_RX_CLK | ENET0_RX_CLK | ENET0_RX_ER | EN-ET0_1588_EVENT2_IN | GPIO4_13 | F3 |
73 | ENET0_TXD3 | ENET0_TXD3 | ENET1_TXD1 | EN-ET0_1588_EVENT1_IN | GPIO4_12 | G2 |
74 | ENET0_TXD2 | ENET0_TXD2 | ENET1_TXD0 | EN-ET0_1588_EVENT1_OUT | GPIO4_11 | G1 |
75 | ENET0_COL | ENET0_COL | ENET1_TX_EN | EN-ET0_1588_EVENT3_OUT | GPIO4_14 | J4 |
76 | ENET0_CRS | ENET0_CRS | ENET1_RX_EN | EN-ET0_1588_EVENT3_IN | GPIO4_15 | J3 |
77 | ENET0_RXD2 | ENET0_RXD2 | ENET1_RXD0 | EN-ET0_1588_EVENT0_OUT | GPIO4_9 | J1 |
78 | ENET0_RXD3 | ENET0_RXD3 | ENET1_RXD1 | EN-ET0_1588_EVENT0_IN | GPIO4_10 | J2 |
79 | ENET_CLK | CLKCTRL_ENET | GPIO4_16 | E2 | ||
80 | ENET0_TX_CLK | ENET0_TX_CLK | HSADC_TRIGGER | EN-ET0_1588_EVENT2_OUT | GPIO4_5 | E3 |
81 | ENET0_MDIO | ENET0_MDIO | GPMI_CE5N | SAIF0_SDATA2 | GPIO4_1 | H4 |
82 | ENET0_MDC | ENET0_MDC | GPMI_CE4N | SAIF0_SDATA1 | GPIO4_0 | G4 |
83 | AUART0_CTS | AUART0_CTS | AUART4_RX | DUART_RX | GPIO3_2 | J6 |
84 | AUART0_RTS | AUART0_RTS | AUART4_TX | DUART_TX | GPIO3_3 | J7 |
85 | AUART3_CTS | AUART3_CTS | CAN1_TX | EN-ET0_1588_EVENT1_OUT | GPIO3_14 | L6 |
86 | AUART3_RTS | AUART3_RTS | CAN1_RX | EN-ET0_1588_EVENT1_IN | GPIO3_15 | K6 |
87 | AUART3_RX | AUART3_RX | CAN0_TX | EN-ET0_1588_EVENT0_OUT | GPIO3_12 | M5 |
88 | AUART3_TX | AUART3_TX | CAN0_RX | EN-ET0_1588_EVENT0_IN | GPIO3_13 | L5 |
89 | AUART2_RX | AUART2_RX | SSP3_D1 | SSP3_D4 | GPIO3_8 | F6 |
90 | AUART2_TX | AUART2_TX | SSP3_D2 | SSP3_D5 | GPIO3_9 | F5 |
91 | AUART1_RX | AUART1_RX | SSP2_CARD_DETECT | PWM_0 | GPIO3_4 | L4 |
92 | AUART1_TX | AUART1_TX | SSP3_CARD_DETECT | PWM_1 | GPIO3_5 | K4 |
93 | AUART0_RX | AUART0_RX | I2C0_SCL | DUART_CTS | GPIO3_0 | G5 |
94 | AUART0_TX | AUART0_TX | I2C0_SDA | DUART_RTS | GPIO3_1 | H5 |
95 | GPMI_RDY3 | GPMI_RDY3 | CAN0_RX | HSADC_TRIGGER | GPIO0_23 | L8 |
96 | GPMI_RDY2 | GPMI_RDY2 | CAN0_TX | ENET0_TX_ER | GPIO0_22 | M8 |
97 | GPMI_CE3N | GPMI_CE3N | CAN1_RX | SAIF1_MCLK | GPIO0_19 | M9 |
98 | GPMI_CE2N | GPMI_CE2N | CAN1_TX | ENET0_RX_ER | GPIO0_18 | M7 |
99 | PWM0 | PWM0 | I2C1_SCL | DUART_RX | GPIO3_16 | K7 |
100 | PWM1 | PWM1 | I2C1_SDA | DUART_TX | GPIO3_17 | L7 |
101 | GPMI_CE0 | GPMI_CE0N | SSP3_D0 | GPIO0_16 | N7 | |
102 | GPMI_READY0 | GPMI_RDN | SSP3_SCK | GPIO0_20 | N6 | |
103 | PWM3 | PWM3 | E9 | |||
104 | PWM4 | PWM4 | 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-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/)
Для успешной загрузки процессорам серии 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, карты памяти и т.д.).
В большинстве случаев может потребоваться пересобрать загрузчик (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.
Исходный код загрузчика находится в 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 карту. Чуть ниже мы рассмотрим процедуры программирования.
Исходный код ядра находится в 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 карту можно создать как на компьютерах с ОС 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ГБ.
Утилита sb_loader.exe позволяет быстро загрузить файл в RAM платы и запустить его. Порядок действий:
Запускаем:
sb_loader.exe -f imx28_ivt_uboot.sb
или
sb_loader.exe -f imx28_ivt_linux.sb
Утилита загрузит указанный файл и начнет выполнение. В запущенной терминальной программе можно увидеть лог выполнения.
Программа 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 можно посмотреть команды записи и создать собственные стратегии.
Убеждаемся, что плата видна в системе:
Нажимаем Start.
В терминальной программе можно наблюдать лог загрузки и выполнение процесса записи. В зависимости от размера файловой система процесс записи может продолжатся до 10 минут.
Удачное окончание выполнения записи
Update Complete! - Запись успешно завершена, лог.
После успешного окончания записи отключаем питание, отключаем USB кабель и переводим DIP-SWITCH в режим загрузки с NAND Flash (0010) или SPI Flash (0100). Подаем питание, в терминальной программе должен пойти лог загрузки.
Можно перезаписать ядро и файловую систему прямо в запущенной плате, при загруженном ядре Линукс. В файловой системе обязательно должны быть включены пакеты kobs-ng и mtd-util (убедитесь в этом при сборке файловой системы). Файлы, которые требуется записать (imx28_ivt_linux.sb и архив с файловой системой rootfs.tar.bz2) запишем на флешку.
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
В некоторых случаях может оказаться обоснованным отказаться от микросхемы NAND Flash и хранить ядро или загрузчик в SPI Flash, а файловую систему разместить, например, на SD карте.
Что для этого потребуется:
Создаем загрузочную 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) на свои, собранные Вами в процессе работы.
В процессе разработки, отладки ядра и файловой системы неудобно постоянно писать ядро, файловую систему на 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 указанной в аргументах запуска ядра. Что в итоге - после пересборки ядра или файловой системы, на плате нажимаем сброс, загрузчик загружает (новое)ядро и монтирует (новую)файловую систему. На все уходит буквально несколько секунд.
Никаких особенностей по сравнению с типовым созданием печатной платы нет, несколько замечаний о которых нужно помнить:
Для управления 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:~#
Для того, чтобы модем 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:~#
Указав в 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. Его можно запустить на той же виртуальной машине, которая доступна для загрузки. Порядок действий:
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 и подайте питание. Система должна загрузиться и смонтироваться.
На некоторых платах 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
Для этого на плате выполняем:
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
Теперь воспользуемся утилитой 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 как уже было описано выше и использовать для загрузки.