diff options
-rw-r--r-- | meta-yocto-bsp/README.hardware.md | 112 | ||||
-rw-r--r-- | meta-yocto-bsp/conf/machine/edgerouter.conf | 26 | ||||
-rw-r--r-- | meta-yocto-bsp/lib/oeqa/controllers/edgeroutertarget.py | 89 | ||||
-rw-r--r-- | meta-yocto-bsp/recipes-kernel/linux/linux-yocto-dev.bbappend | 2 | ||||
-rw-r--r-- | meta-yocto-bsp/recipes-kernel/linux/linux-yocto_5.15.bbappend | 4 | ||||
-rw-r--r-- | meta-yocto-bsp/recipes-kernel/linux/linux-yocto_6.1.bbappend | 4 | ||||
-rw-r--r-- | meta-yocto-bsp/wic/edgerouter.wks | 4 |
7 files changed, 0 insertions, 241 deletions
diff --git a/meta-yocto-bsp/README.hardware.md b/meta-yocto-bsp/README.hardware.md index 44dbb35b93..8ea0ef1461 100644 --- a/meta-yocto-bsp/README.hardware.md +++ b/meta-yocto-bsp/README.hardware.md | |||
@@ -28,7 +28,6 @@ Hardware Reference Boards | |||
28 | The following boards are supported by the meta-yocto-bsp layer: | 28 | The following boards are supported by the meta-yocto-bsp layer: |
29 | 29 | ||
30 | * Texas Instruments Beaglebone (beaglebone-yocto) | 30 | * Texas Instruments Beaglebone (beaglebone-yocto) |
31 | * Ubiquiti Networks EdgeRouter Lite (edgerouter) | ||
32 | * General IA platforms (genericx86 and genericx86-64) | 31 | * General IA platforms (genericx86 and genericx86-64) |
33 | 32 | ||
34 | For more information see the board's section below. The appropriate MACHINE | 33 | For more information see the board's section below. The appropriate MACHINE |
@@ -48,7 +47,6 @@ Consumer Devices | |||
48 | The following consumer devices are supported by the meta-yocto-bsp layer: | 47 | The following consumer devices are supported by the meta-yocto-bsp layer: |
49 | 48 | ||
50 | * Intel x86 based PCs and devices (genericx86) | 49 | * Intel x86 based PCs and devices (genericx86) |
51 | * Ubiquiti Networks EdgeRouter Lite (edgerouter) | ||
52 | 50 | ||
53 | For more information see the device's section below. The appropriate MACHINE | 51 | For more information see the device's section below. The appropriate MACHINE |
54 | variable value corresponding to the device is given in brackets. | 52 | variable value corresponding to the device is given in brackets. |
@@ -153,113 +151,3 @@ From a Linux system with access to the image files perform the following steps: | |||
153 | # dd if=core-image-minimal-beaglebone-yocto.wic of=/dev/sdb | 151 | # dd if=core-image-minimal-beaglebone-yocto.wic of=/dev/sdb |
154 | 152 | ||
155 | 3. Insert the SD card into the Beaglebone and boot the board. | 153 | 3. Insert the SD card into the Beaglebone and boot the board. |
156 | |||
157 | Ubiquiti Networks EdgeRouter Lite (edgerouter) | ||
158 | ============================================== | ||
159 | |||
160 | The EdgeRouter Lite is part of the EdgeMax series. It is a MIPS64 router | ||
161 | (based on the Cavium Octeon processor) with 512MB of RAM, which uses an | ||
162 | internal USB pendrive for storage. | ||
163 | |||
164 | Setup instructions | ||
165 | ------------------ | ||
166 | |||
167 | You will need the following: | ||
168 | * RJ45 -> serial ("rollover") cable connected from your PC to the CONSOLE | ||
169 | port on the device | ||
170 | * Ethernet connected to the first ethernet port on the board | ||
171 | |||
172 | If using NFS as part of the setup process, you will also need: | ||
173 | * NFS root setup on your workstation | ||
174 | * TFTP server installed on your workstation (if fetching the kernel from | ||
175 | TFTP, see below). | ||
176 | |||
177 | --- Preparation --- | ||
178 | |||
179 | Build an image (e.g. core-image-minimal) using "edgerouter" as the MACHINE. | ||
180 | In the following instruction it is based on core-image-minimal. Another target | ||
181 | may be similiar with it. | ||
182 | |||
183 | --- Booting from NFS root / kernel via TFTP --- | ||
184 | |||
185 | Load the kernel, and boot the system as follows: | ||
186 | |||
187 | 1. Get the kernel (vmlinux) file from the tmp/deploy/images/edgerouter | ||
188 | directory, and make them available on your TFTP server. | ||
189 | |||
190 | 2. Connect the board's first serial port to your workstation and then start up | ||
191 | your favourite serial terminal so that you will be able to interact with | ||
192 | the serial console. If you don't have a favourite, picocom is suggested: | ||
193 | |||
194 | $ picocom /dev/ttyS0 -b 115200 | ||
195 | |||
196 | 3. Power up or reset the board and press a key on the terminal when prompted | ||
197 | to get to the U-Boot command line | ||
198 | |||
199 | 4. Set up the environment in U-Boot: | ||
200 | |||
201 | => setenv ipaddr <board ip> | ||
202 | => setenv serverip <tftp server ip> | ||
203 | |||
204 | 5. Download the kernel and boot: | ||
205 | |||
206 | => tftp $loadaddr vmlinux | ||
207 | => bootoctlinux $loadaddr coremask=0x3 root=/dev/nfs rw nfsroot=<nfsroot ip>:<rootfs path> ip=<board ip>:<server ip>:<gateway ip>:<netmask>:edgerouter:eth0:off mtdparts=phys_mapped_flash:512k(boot0),512k(boot1),64k@3072k(eeprom) | ||
208 | |||
209 | --- Booting from USB disk --- | ||
210 | |||
211 | To boot from the USB disk, you either need to remove it from the edgerouter | ||
212 | box and populate it from another computer, or use a previously booted NFS | ||
213 | image and populate from the edgerouter itself. | ||
214 | |||
215 | Type 1: Use partitioned image | ||
216 | ----------------------------- | ||
217 | |||
218 | Steps: | ||
219 | |||
220 | 1. Remove the USB disk from the edgerouter and insert it into a computer | ||
221 | that has access to your build artifacts. | ||
222 | |||
223 | 2. Flash the image. | ||
224 | |||
225 | # dd if=core-image-minimal-edgerouter.wic of=/dev/sdb | ||
226 | |||
227 | 3. Insert USB disk into the edgerouter and boot it. | ||
228 | |||
229 | Type 2: NFS | ||
230 | ----------- | ||
231 | |||
232 | Note: If you place the kernel on the ext3 partition, you must re-create the | ||
233 | ext3 filesystem, since the factory u-boot can only handle 128 byte inodes and | ||
234 | cannot read the partition otherwise. | ||
235 | |||
236 | These boot instructions assume that you have recreated the ext3 filesystem with | ||
237 | 128 byte inodes, you have an updated uboot or you are running and image capable | ||
238 | of making the filesystem on the board itself. | ||
239 | |||
240 | |||
241 | 1. Boot from NFS root | ||
242 | |||
243 | 2. Mount the USB disk partition 2 and then extract the contents of | ||
244 | tmp/deploy/core-image-XXXX.tar.bz2 into it. | ||
245 | |||
246 | Before starting, copy core-image-minimal-xxx.tar.bz2 and vmlinux into | ||
247 | rootfs path on your workstation. | ||
248 | |||
249 | and then, | ||
250 | |||
251 | # mount /dev/sda2 /media/sda2 | ||
252 | # tar -xvjpf core-image-minimal-XXX.tar.bz2 -C /media/sda2 | ||
253 | # cp vmlinux /media/sda2/boot/vmlinux | ||
254 | # umount /media/sda2 | ||
255 | # reboot | ||
256 | |||
257 | 3. Reboot the board and press a key on the terminal when prompted to get to the U-Boot | ||
258 | command line: | ||
259 | |||
260 | # reboot | ||
261 | |||
262 | 4. Load the kernel and boot: | ||
263 | |||
264 | => ext2load usb 0:2 $loadaddr boot/vmlinux | ||
265 | => bootoctlinux $loadaddr coremask=0x3 root=/dev/sda2 rw rootwait mtdparts=phys_mapped_flash:512k(boot0),512k(boot1),64k@3072k(eeprom) | ||
diff --git a/meta-yocto-bsp/conf/machine/edgerouter.conf b/meta-yocto-bsp/conf/machine/edgerouter.conf deleted file mode 100644 index ffdcf55f02..0000000000 --- a/meta-yocto-bsp/conf/machine/edgerouter.conf +++ /dev/null | |||
@@ -1,26 +0,0 @@ | |||
1 | #@TYPE: Machine | ||
2 | #@NAME: Edgerouter | ||
3 | #@DESCRIPTION: Machine configuration for a generic edgerouter | ||
4 | |||
5 | require conf/machine/include/mips/tune-mips64.inc | ||
6 | |||
7 | MACHINE_FEATURES = "pci ext2 ext3 serial" | ||
8 | |||
9 | KERNEL_IMAGETYPE = "vmlinux" | ||
10 | KERNEL_ALT_IMAGETYPE = "vmlinux.bin" | ||
11 | KERNEL_IMAGE_STRIP_EXTRA_SECTIONS = ".comment" | ||
12 | |||
13 | PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto" | ||
14 | PREFERRED_VERSION_linux-yocto ?= "6.1%" | ||
15 | |||
16 | SERIAL_CONSOLES = "115200;ttyS0" | ||
17 | USE_VT ?= "0" | ||
18 | |||
19 | MACHINE_EXTRA_RRECOMMENDS = "kernel-modules" | ||
20 | |||
21 | IMAGE_FSTYPES ?= "jffs2 tar.bz2 wic wic.bmap" | ||
22 | JFFS2_ERASEBLOCK = "0x10000" | ||
23 | |||
24 | WKS_FILE ?= "edgerouter.wks" | ||
25 | IMAGE_BOOT_FILES ?= "vmlinux;vmlinux.64" | ||
26 | do_image_wic[depends] += "mtools-native:do_populate_sysroot dosfstools-native:do_populate_sysroot" | ||
diff --git a/meta-yocto-bsp/lib/oeqa/controllers/edgeroutertarget.py b/meta-yocto-bsp/lib/oeqa/controllers/edgeroutertarget.py deleted file mode 100644 index e31670db48..0000000000 --- a/meta-yocto-bsp/lib/oeqa/controllers/edgeroutertarget.py +++ /dev/null | |||
@@ -1,89 +0,0 @@ | |||
1 | # Copyright (C) 2014 Intel Corporation | ||
2 | # | ||
3 | # Released under the MIT license (see COPYING.MIT) | ||
4 | |||
5 | # This module adds support to testimage.bbclass to deploy images and run | ||
6 | # tests on a Ubiquiti Networks EdgeRouter Lite. The device must be set up | ||
7 | # to boot into the master image already - the easiest way to do that is as | ||
8 | # follows: | ||
9 | # | ||
10 | # 1. Take out the internal USB drive and plug it into your PC | ||
11 | # 2. Repartition the USB drive so that you have three partitions in this | ||
12 | # order: | ||
13 | # 1: vfat, labelled "boot" (it will need to be formatted with mkfs.vfat | ||
14 | # for this to be possible, since FAT partitions formatted under | ||
15 | # DOS/Windows will only support uppercase labels) | ||
16 | # 2: ext3 (for master image) labelled "testmaster" | ||
17 | # 3: ext3 (for image under test) labelled "testrootfs" | ||
18 | # 3. Copy the kernel to be used by the master image to the FAT partition | ||
19 | # (it should be named "vmlinux.64" with the factory u-boot configuration) | ||
20 | # 4. Install the master image onto the "testmaster" ext3 partition. If | ||
21 | # you do this by just extracting the contents of an image onto the | ||
22 | # partition, you will also likely need to create the master image marker | ||
23 | # file /etc/masterimage within this partition so that we can tell when | ||
24 | # we're booted into it that it is the master image. | ||
25 | # 5. Put the USB drive back into the device, and ensure the console port | ||
26 | # and first ethernet port are connected before powering on | ||
27 | # | ||
28 | # TEST_SERIALCONTROL_CMD will need to be set in local.conf so that we can | ||
29 | # interact with u-boot over the serial console port. | ||
30 | |||
31 | import os | ||
32 | import bb | ||
33 | import time | ||
34 | import subprocess | ||
35 | import sys | ||
36 | import pexpect | ||
37 | |||
38 | from oeqa.controllers.controllerimage import ControllerImageHardwareTarget | ||
39 | |||
40 | |||
41 | class EdgeRouterTarget(ControllerImageHardwareTarget): | ||
42 | |||
43 | def __init__(self, d): | ||
44 | super(EdgeRouterTarget, self).__init__(d) | ||
45 | |||
46 | self.image_fstype = self.get_image_fstype(d) | ||
47 | self.deploy_cmds = [ | ||
48 | 'mount -L boot /boot', | ||
49 | 'mkdir -p /mnt/testrootfs', | ||
50 | 'mount -L testrootfs /mnt/testrootfs', | ||
51 | 'cp ~/test-kernel /boot', | ||
52 | 'rm -rf /mnt/testrootfs/*', | ||
53 | 'tar xvf ~/test-rootfs.%s -C /mnt/testrootfs' % self.image_fstype | ||
54 | ] | ||
55 | if not self.serialcontrol_cmd: | ||
56 | bb.fatal("This TEST_TARGET needs a TEST_SERIALCONTROL_CMD defined in local.conf.") | ||
57 | |||
58 | |||
59 | def _deploy(self): | ||
60 | self.controller.run("umount /mnt/testrootfs;") | ||
61 | self.controller.ignore_status = False | ||
62 | self.controller.copy_to(self.kernel, "~/test-kernel") | ||
63 | self.controller.copy_to(self.rootfs, "~/test-rootfs.%s" % self.image_fstype) | ||
64 | for cmd in self.deploy_cmds: | ||
65 | self.controller.run(cmd) | ||
66 | |||
67 | def _start(self, params=None): | ||
68 | self.power_cycle(self.controller) | ||
69 | try: | ||
70 | serialconn = pexpect.spawn(self.serialcontrol_cmd, env=self.origenv, logfile=sys.stdout) | ||
71 | serialconn.expect("U-Boot") | ||
72 | serialconn.sendline("a") | ||
73 | serialconn.expect("Octeon ubnt_e100#") | ||
74 | serialconn.sendline("fatload usb 0:1 $loadaddr test-kernel") | ||
75 | serialconn.expect(" bytes read") | ||
76 | serialconn.expect("Octeon ubnt_e100#") | ||
77 | serialconn.sendline("bootoctlinux $loadaddr coremask=0x3 root=/dev/sda3 rw rootwait mtdparts=phys_mapped_flash:512k(boot0),512k(boot1),64k@3072k(eeprom)") | ||
78 | serialconn.expect("login:", timeout=120) | ||
79 | serialconn.close() | ||
80 | except pexpect.ExceptionPexpect as e: | ||
81 | bb.fatal('Serial interaction failed: %s' % str(e)) | ||
82 | |||
83 | def _wait_until_booted(self): | ||
84 | try: | ||
85 | serialconn = pexpect.spawn(self.serialcontrol_cmd, env=self.origenv, logfile=sys.stdout) | ||
86 | serialconn.expect("login:", timeout=120) | ||
87 | serialconn.close() | ||
88 | except pexpect.ExceptionPexpect as e: | ||
89 | bb.fatal('Serial interaction failed: %s' % str(e)) | ||
diff --git a/meta-yocto-bsp/recipes-kernel/linux/linux-yocto-dev.bbappend b/meta-yocto-bsp/recipes-kernel/linux/linux-yocto-dev.bbappend index a90958f546..4a62ac952c 100644 --- a/meta-yocto-bsp/recipes-kernel/linux/linux-yocto-dev.bbappend +++ b/meta-yocto-bsp/recipes-kernel/linux/linux-yocto-dev.bbappend | |||
@@ -1,6 +1,5 @@ | |||
1 | KBRANCH:genericx86 = "standard/base" | 1 | KBRANCH:genericx86 = "standard/base" |
2 | KBRANCH:genericx86-64 = "standard/base" | 2 | KBRANCH:genericx86-64 = "standard/base" |
3 | KBRANCH:edgerouter = "standard/edgerouter" | ||
4 | KBRANCH:beaglebone-yocto = "standard/beaglebone" | 3 | KBRANCH:beaglebone-yocto = "standard/beaglebone" |
5 | 4 | ||
6 | KMACHINE:genericx86 ?= "common-pc" | 5 | KMACHINE:genericx86 ?= "common-pc" |
@@ -9,5 +8,4 @@ KMACHINE:beaglebone-yocto ?= "beaglebone" | |||
9 | 8 | ||
10 | COMPATIBLE_MACHINE:genericx86 = "genericx86" | 9 | COMPATIBLE_MACHINE:genericx86 = "genericx86" |
11 | COMPATIBLE_MACHINE:genericx86-64 = "genericx86-64" | 10 | COMPATIBLE_MACHINE:genericx86-64 = "genericx86-64" |
12 | COMPATIBLE_MACHINE:edgerouter = "edgerouter" | ||
13 | COMPATIBLE_MACHINE:beaglebone-yocto = "beaglebone-yocto" | 11 | COMPATIBLE_MACHINE:beaglebone-yocto = "beaglebone-yocto" |
diff --git a/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_5.15.bbappend b/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_5.15.bbappend index 87aa38a85e..7a33505b55 100644 --- a/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_5.15.bbappend +++ b/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_5.15.bbappend | |||
@@ -1,6 +1,5 @@ | |||
1 | KBRANCH:genericx86 = "v5.15/standard/base" | 1 | KBRANCH:genericx86 = "v5.15/standard/base" |
2 | KBRANCH:genericx86-64 = "v5.15/standard/base" | 2 | KBRANCH:genericx86-64 = "v5.15/standard/base" |
3 | KBRANCH:edgerouter = "v5.15/standard/edgerouter" | ||
4 | KBRANCH:beaglebone-yocto = "v5.15/standard/beaglebone" | 3 | KBRANCH:beaglebone-yocto = "v5.15/standard/beaglebone" |
5 | 4 | ||
6 | KMACHINE:genericx86 ?= "common-pc" | 5 | KMACHINE:genericx86 ?= "common-pc" |
@@ -9,15 +8,12 @@ KMACHINE:beaglebone-yocto ?= "beaglebone" | |||
9 | 8 | ||
10 | SRCREV_machine:genericx86 ?= "024d08fb706170a9723e9751e505681f9d4c7ab6" | 9 | SRCREV_machine:genericx86 ?= "024d08fb706170a9723e9751e505681f9d4c7ab6" |
11 | SRCREV_machine:genericx86-64 ?= "024d08fb706170a9723e9751e505681f9d4c7ab6" | 10 | SRCREV_machine:genericx86-64 ?= "024d08fb706170a9723e9751e505681f9d4c7ab6" |
12 | SRCREV_machine:edgerouter ?= "2ac6461adfceb54f47a756046fbdd142adce4301" | ||
13 | SRCREV_machine:beaglebone-yocto ?= "26aee42556a000123129552b73de6bf2ac039034" | 11 | SRCREV_machine:beaglebone-yocto ?= "26aee42556a000123129552b73de6bf2ac039034" |
14 | 12 | ||
15 | COMPATIBLE_MACHINE:genericx86 = "genericx86" | 13 | COMPATIBLE_MACHINE:genericx86 = "genericx86" |
16 | COMPATIBLE_MACHINE:genericx86-64 = "genericx86-64" | 14 | COMPATIBLE_MACHINE:genericx86-64 = "genericx86-64" |
17 | COMPATIBLE_MACHINE:edgerouter = "edgerouter" | ||
18 | COMPATIBLE_MACHINE:beaglebone-yocto = "beaglebone-yocto" | 15 | COMPATIBLE_MACHINE:beaglebone-yocto = "beaglebone-yocto" |
19 | 16 | ||
20 | LINUX_VERSION:genericx86 = "5.15.103" | 17 | LINUX_VERSION:genericx86 = "5.15.103" |
21 | LINUX_VERSION:genericx86-64 = "5.15.103" | 18 | LINUX_VERSION:genericx86-64 = "5.15.103" |
22 | LINUX_VERSION:edgerouter = "5.15.103" | ||
23 | LINUX_VERSION:beaglebone-yocto = "5.15.103" | 19 | LINUX_VERSION:beaglebone-yocto = "5.15.103" |
diff --git a/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_6.1.bbappend b/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_6.1.bbappend index dc58f988eb..b80c51848d 100644 --- a/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_6.1.bbappend +++ b/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_6.1.bbappend | |||
@@ -1,6 +1,5 @@ | |||
1 | KBRANCH:genericx86 = "v6.1/standard/base" | 1 | KBRANCH:genericx86 = "v6.1/standard/base" |
2 | KBRANCH:genericx86-64 = "v6.1/standard/base" | 2 | KBRANCH:genericx86-64 = "v6.1/standard/base" |
3 | KBRANCH:edgerouter = "v6.1/standard/edgerouter" | ||
4 | KBRANCH:beaglebone-yocto = "v6.1/standard/beaglebone" | 3 | KBRANCH:beaglebone-yocto = "v6.1/standard/beaglebone" |
5 | 4 | ||
6 | KMACHINE:genericx86 ?= "common-pc" | 5 | KMACHINE:genericx86 ?= "common-pc" |
@@ -9,15 +8,12 @@ KMACHINE:beaglebone-yocto ?= "beaglebone" | |||
9 | 8 | ||
10 | SRCREV_machine:genericx86 ?= "423e1996694b61fbfc8ec3bf062fc6461d64fde1" | 9 | SRCREV_machine:genericx86 ?= "423e1996694b61fbfc8ec3bf062fc6461d64fde1" |
11 | SRCREV_machine:genericx86-64 ?= "423e1996694b61fbfc8ec3bf062fc6461d64fde1" | 10 | SRCREV_machine:genericx86-64 ?= "423e1996694b61fbfc8ec3bf062fc6461d64fde1" |
12 | SRCREV_machine:edgerouter ?= "423e1996694b61fbfc8ec3bf062fc6461d64fde1" | ||
13 | SRCREV_machine:beaglebone-yocto ?= "423e1996694b61fbfc8ec3bf062fc6461d64fde1" | 11 | SRCREV_machine:beaglebone-yocto ?= "423e1996694b61fbfc8ec3bf062fc6461d64fde1" |
14 | 12 | ||
15 | COMPATIBLE_MACHINE:genericx86 = "genericx86" | 13 | COMPATIBLE_MACHINE:genericx86 = "genericx86" |
16 | COMPATIBLE_MACHINE:genericx86-64 = "genericx86-64" | 14 | COMPATIBLE_MACHINE:genericx86-64 = "genericx86-64" |
17 | COMPATIBLE_MACHINE:edgerouter = "edgerouter" | ||
18 | COMPATIBLE_MACHINE:beaglebone-yocto = "beaglebone-yocto" | 15 | COMPATIBLE_MACHINE:beaglebone-yocto = "beaglebone-yocto" |
19 | 16 | ||
20 | LINUX_VERSION:genericx86 = "6.1.20" | 17 | LINUX_VERSION:genericx86 = "6.1.20" |
21 | LINUX_VERSION:genericx86-64 = "6.1.20" | 18 | LINUX_VERSION:genericx86-64 = "6.1.20" |
22 | LINUX_VERSION:edgerouter = "6.1.20" | ||
23 | LINUX_VERSION:beaglebone-yocto = "6.1.20" | 19 | LINUX_VERSION:beaglebone-yocto = "6.1.20" |
diff --git a/meta-yocto-bsp/wic/edgerouter.wks b/meta-yocto-bsp/wic/edgerouter.wks deleted file mode 100644 index 7176fe436b..0000000000 --- a/meta-yocto-bsp/wic/edgerouter.wks +++ /dev/null | |||
@@ -1,4 +0,0 @@ | |||
1 | # short-description: Create SD card image for Edgerouter | ||
2 | # long-description: Create a partitioned SD card image for MIPS64 Edgerouter reference hardware. | ||
3 | part /boot --source bootimg-partition --ondisk sda --fstype=vfat --label boot --active --align 4 --size 16 | ||
4 | part / --source rootfs --ondisk sda --fstype=ext4 --label root --align 4 | ||