TS-4800: Difference between revisions

From embeddedTS Manuals
mNo edit summary
No edit summary
Line 20: Line 20:
The TS-4800 is a TS-SOCKET macrocontroller board based on the Freescale i.MX515 ARM Cortex-A8 CPU running at 800MHz. The TS-4800 features 10/100 Ethernet, high speed USB host and device (OTG), microSD card, and 256MB XNAND drive.
The TS-4800 is a TS-SOCKET macrocontroller board based on the Freescale i.MX515 ARM Cortex-A8 CPU running at 800MHz. The TS-4800 features 10/100 Ethernet, high speed USB host and device (OTG), microSD card, and 256MB XNAND drive.


'''This page is still very much under construction.  Refer to the TS-Socket manual for information for now.'''
'''This page is still very much under construction.  Refer to the [http://www.embeddedarm.com/about/resource.php?item=509 TS-Socket manual] for information for now.'''
 
 
= Getting Started =
{{:Generic Getting Started}}
 
The TS-4800 receives power through several pins on the socket connector.  Refer to your baseboard documentation or schematics for locating the power in on your board.
 
== Get a Console ==
Console on the TS-4800 will by default come out of the CPU UART (ttyS0).  If you hold the power button for 5 seconds it will redirect Console to xuart port 1 (the red LED will turn on when you have held it long enough).  You can find more details about where these UARTS are brought from your baseboard COM ports section.  Either console will use 8n1, no flow control, and a 115200 baud rate.
 
You can also telnet to the board with the [[default network configuration]], though this will omit the [[TS-BOOTROM]] messages which can be helpful for diagnostics.
 
{{:Console from Workstation}}
 
 
== Initrd / Busybox / Fastboot ==
When the board first boots you should see output similar to this:
 
  >> TS-BOOTROM - built Jan 24 2011 12:40:54
  >> Copyright (c) 2010, Technologic Systems
  >> Booting from SD card...
  .
  .
  .
  Finished booting in 1.11 seconds
  Type 'tshelp' for help
 
This is a busybox shell which presents you with a very minimalistic system.  This filesystem is loaded into memory, so none of the changes will be saved unless you type the command
<source lang=bash>
save
</source>
or mount a filesystem as read/write.  This can also provide a simple mechanism for running your application in an entirely read-only environment.  The linuxrc script will be the first thing executed as soon as the kernel is loaded.  This sets the default IP address, loads a reloadable FPGA bitstream if one is present, starts the userspace ctl applications, and more.  Read the linuxrc for more information.
 
While busybox itself doesn't contain much functionality, it does mount the [[Debian]] partition under /mnt/root/.  It will also add common paths and load libraries from the [[Debian]] system.  Many of the [[Debian]] applications will work by default.  Whether or not a Debian application will work in fastboot needs to be judged per application.  If an application relies on certain paths being in certain places, or running services, you should instead boot to [[Debian]] to run them.
 
This shell when started on the COM port is what is blocking a [[Debian]] boot.  If you close it by typing
<source lang=bash>
exit
</source>
the boot process will continue.  If you are connected through telnet, this will instead open up its own instance of the shell so typing
<source lang=bash>
exit
</source>
will only end that session.  Through any connection method you can relink the linuxrc to change it to boot by default to Debian.
 
The initrd has these boot scripts available:
{| class="wikitable"
|-
! Script
! Function
|-
| linuxrc-fastboot (default)
| Boots immediately to a shell in ramdisk.  This will mount whichever boot medium you have selected to /mnt/root/.  When you type 'exit', it will boot to that medium.
|-
| linuxrc-sdroot
| Boots immediately to the Debian stored on SD.
|-
| linuxrc-xnandroot
| Boots immediately to the Debian stored on the XNAND.
|-
| linuxrc-sdroot-ubuntu
| Boots immediately to the first partition which contains Ubuntu.  This is only available on the 8GB SD cards.
|}
 
{{Note|Keep in mind the boot medium is selected by the pinout on your baseboard, not through software.  The ramdisk and kernel will be loaded before the linuxrc begins execution.}}
For example, to set the linuxrc to boot immediately to Debian on SD or NAND, you would run this:
<source lang=bash>
rm linuxrc; ln -s /linuxrc-sdroot /linuxrc; save
</source>
 
You can edit the linuxrc-4800 to create more booting methods (NFS, USB, etc). 
 
The small default initrd is only 2Mbyte but there is space for approximately 300 Kbyte of additional user applications. The binaries on the initrd are dynamically linked against embedded Linux's "uclibc" library instead of the more common Linux C library "glibc". "uclibc" is a smaller version of the standard C library optimized for embedded systems and requires a different set of GCC compiler tools which are available [ftp://oz.embeddedarm.com/ts-socket-macrocontrollers/ts-4800-linux/cross-toolchains/crosstool-linux-arm-uclibc-4.3.5.tar.gz here].
 
  The compiled instance of busybox includes several internal commands listed below:
  BusyBox v1.14.2 (2011-02-03 15:49:11 MST) multi-call binary
  Copyright (C) 1998-2008 Erik Andersen, Rob Landley, Denys Vlasenko
  and others. Licensed under GPLv2.
  See source distribution for full notice.
 
  Usage: busybox [function] [arguments]...
    or: function [arguments]...
 
          BusyBox is a multi-call binary that combines many common Unix
          utilities into a single executable.  Most people will create a
          link to busybox for each function they wish to use and BusyBox
          will act like whatever it was invoked as!
 
  Currently defined functions:
          [, [[, ar, ash, basename, cat, chat, chgrp, chmod, chown, chroot,
          cmp, cp, cpio, cttyhack, cut, date, dd, depmod, devmem, df, dirname,
          dmesg, du, echo, egrep, env, expr, false, fdisk, fgrep, find, grep,
          gunzip, gzip, halt, head, hostname, hush, ifconfig, insmod, kill,
          killall, ln, login, ls, lsmod, md5sum, mdev, mkdir, mknod, modprobe,
          more, mount, msh, mv, netstat, ping, pivot_root, poweroff, printf,
          ps, pwd, reboot, rm, rmdir, rmmod, route, rx, sed, setconsole,
          setsid, sh, sleep, stty, sync, tail, tar, telnetd, test, tftp,
          top, tr, true, udhcpc, umount, uname, unzip, usleep, uudecode,
          uuencode, vi, wget, xargs, yes, zcat
 
Also on the initrd are the TS specific applications: [[canctl]], [[dioctl]], [[nandctl]], [[spictl]], [[ts4800ctl]], and [[xuartctl]].  We also provide the ts.subr which provides the following functions:
 
  bit_set()
  bit_clr()
  bit_get()
  gpio_dir_get()
  gpio_dir_set()
  gpio_data_get()
  gpio_data_set()
  dio_dir_get()
  dio_dir_set()
  dio_data_get()
  dio_data_set()
  usb_on()
  usb_off()
  usb_init()
  usb_numports()
  usb_port_devexists()
  usbload()
  bbclk_on()
  bbclk_off()
  led0()
  led1()
  lcd_on()
  lcd_off()
  backlite_on()
  backlite_off()
  backlite_high()
  backlite_medium()
  backlite_low()
  fix_display()
  touchscreen_on()
  touchscreen_off()
  tpc_up()
  can0_on()
  can0_off()
  can1_on()
  can1_off()
  xuart0_on()
  xuart0_off()
  xuart3_on()
  xuart3_off()
  xuart4_on()
  xuart4_off()
  xuart5_on()
  xuart5_off()
  spi_on()
  spi_off()
  motor_on()
  motor_off()
  snd_on()
  snd_off()
  irq5_on()
  irq5_off()
  irq6_on()
  irq6_off()
  irq7_on()
  irq7_off()
  spk_on()
  spk_off()
  is_ts4800
  mxtime()
  save2sd
  save2xnand
  save
  sd2xnand
  xnand2sd
  createxnandboot
  createxnandroot()
  get_2nd_mac()
  tshelp()
  sdmount()
  help()
 
By default, linuxrc will not insert the necessary modules into the kernel to mount and use USB devices within the initrd/busybox environment if there is no USB device present upon bootup (USB support is enabled by default within the Debian environment). The quickest way to get a USB device (like a USB thumb drive) to mount in the initrd/busybox environment is to ensure that it is plugged in before the SBC is powered up. In order to get hot-swappable USB devices regardless of device presence at bootup time, you must "modprobe" the necessary modules. This has been done for you in the ts.subr file with the usbload() function.
 
= Boot Process =
[[File:Socket-boot-diagram.png|400px|thumb|right|Boot Process]]
 
This board uses the [[TS-BOOTROM]] implemented in our FPGA.  When the board is powered on the FPGA checks the state of the boot jumpers and then begins execution in the MBR of the selected storage device.  By default any boot device will have a kernel, and a ramdisk with busybox.  On the SD card and XNAND there is a copy of [[Debian]].
 
 
= Backup / Restore =
{{:Write images through USB}}
 
== MicroSD Card ==
If backing up on a separate workstation, keep in mind windows does not have direct block device support needed to write these images.  You will also need to determine the SD card device.  You can usually find this in the output of 'dmesg' after inserting the SD card and you will typically see something like '/dev/sdb' as the block device and '/dev/sdb1' for the first partition.  On some newer kernels you will see '/dev/mmcblk0' as the block device and '/dev/mmcblkop1' for the first partition.  For these examples I will use the '/dev/mmcblk0' format.
 
If you are backing up directly on the board you will likely need to use some kind of offboard storage like a thumbdrive or external hard drive.  Make sure you have any nbd devices unmounted before trying to restore new ones. 
 
It is always recommended to use the latest image.  You should use [ftp://ftp.embeddedarm.com/ts-socket-macrocontrollers/ts-4800-linux/binaries/ts-images/2gbsd-latest.dd.gz this 2GB SD image] and [ftp://ftp.embeddedarm.com/ts-socket-macrocontrollers/ts-4800-linux/binaries/ts-images/8gbsd-img-latest.dd.gz this 8GB SD image].
 
Make sure you decompress the image first before writing.
 
{{Note|Not all SD cards are created equally, over time they tend to shrink in size due to automatic retiring of bad blocks.  All of Technologic System's images are 10% smaller than the target disc size.  We STRONGLY recommend following that same practice on any mass-replicated images.}}
 
''' From Workstation ''' 
----
 
'''Backup '''
 
Entire SD card
<source lang=bash>
dd if=/dev/mmcblk0 of=/path/to/backup.dd bs=32k
</source>
 
Kernel
<source lang=bash>
dd if=/dev/mmcblk0p2 of=/path/to/zImage bs=32k
</source>
 
Initrd
<source lang=bash>
dd if=/dev/mmcblk0p3 of=/path/to/initrd bs=32k
</source>
 
''' Restore'''
 
Entire SD card
<source lang=bash>
dd if=/path/to/backup.dd of=/dev/mmcblk0 bs=32k
</source>
 
Kernel
<source lang=bash>
dd if=/path/to/zImage bs=32k of=/dev/mmcblk0p2
</source>
 
Initrd
<source lang=bash>
dd if=/initrd bs=32k of=/dev/mmcblk0p3
</source>
 
''' From SBC '''
----
'''Backup'''
 
Entire card
<source lang=bash>
dd if=/dev/mmcblk0 of=/path/to/backup.dd
</source>
{{Note|Not all SD cards are created equally, over time they tend to shrink in size due to automatic retiring of bad blocks.  All of Technologic System's images are 10% smaller than the target disc size.  We STRONGLY recommend following that same practice on any mass-replicated images.}}
 
Kernel
<source lang=bash>
dd if=/dev/mmcblk0p2 of=/path/to/backup.dd
</source>
 
Initrd
<source lang=bash>
dd if=/dev/mmcblk0p3 of=/path/to/backup.dd
</source>
 
'''Restore'''
 
The entire card from SBC
<source lang=bash>
dd if=/path/to/2GB-mSD-4800-latest.dd of=/dev/mmcblk0
</source>
 
Kernel
<source lang=bash>
dd if=/mnt/root/zImage of=/dev/mmcblk0p2
</source>
 
Initrd
<source lang=bash>
dd if=/mnt/root/initrd of=/dev/mmcblk0p3
</source>
 
= Operating System =
Our boards boot a standard [[Debian]] Squeeze (EABI) distribution which provides a large amount of software that you can install with relatively little effort.  See the [[Debian]] page for more general information on installing/removing software, and further documentation.


= Software Development =
= Software Development =

Revision as of 11:33, 11 October 2011

TS-4800
TS-4800.jpg
Product Page
Documentation
Schematic
Mechanical Drawing
FTP Path
Freescale i.MX515 Documentation
i.MX515 Product Page
Reference Manual

Overview

The TS-4800 is a TS-SOCKET macrocontroller board based on the Freescale i.MX515 ARM Cortex-A8 CPU running at 800MHz. The TS-4800 features 10/100 Ethernet, high speed USB host and device (OTG), microSD card, and 256MB XNAND drive.

This page is still very much under construction. Refer to the TS-Socket manual for information for now.


Getting Started

A Linux PC is recommended for development. For developers who use Windows, virtualized Linux using VMWare or similar are recommended in order to make the full power of Linux available. The developer will need to be comfortable with Linux anyway in order to work with embedded Linux on the target platform. The main reasons that Linux is useful are:

  • Linux filesystems on the microSD card can be accessed on the PC.
  • More ARM cross-compilers are available.
  • If recovery is needed, a bootable medium can be written.
  • A network filesystem can be served.
  • Builds such as Linux kernel, buildroot, yocto, distro-seed will not work from WSL1/2 on a case insensitive filesystem.
WARNING: Be sure to take appropriate Electrostatic Discharge (ESD) precautions. Disconnect the power source before moving, cabling, or performing any set up procedures. Inappropriate handling may cause damage to the board.

The TS-4800 receives power through several pins on the socket connector. Refer to your baseboard documentation or schematics for locating the power in on your board.

Get a Console

Console on the TS-4800 will by default come out of the CPU UART (ttyS0). If you hold the power button for 5 seconds it will redirect Console to xuart port 1 (the red LED will turn on when you have held it long enough). You can find more details about where these UARTS are brought from your baseboard COM ports section. Either console will use 8n1, no flow control, and a 115200 baud rate.

You can also telnet to the board with the default network configuration, though this will omit the TS-BOOTROM messages which can be helpful for diagnostics.

Use a null modem cable to connect the ARM system to your workstation. If you do not have a COM port on your system (as many newer systems do not), you can find a USB serial adapter that will bring out RS232.

Console from Linux

There are many serial clients for Linux, but 3 simple ones would be picocom, screen, and minicom. These examples assume that your COM device is /dev/ttyUSB0 (common for USB adapters), but replace them with the COM device on your workstation.

Linux has a few applications capable of connecting to the board over serial. You can use any of these clients that may be installed or available in your workstation's package manager:

Picocom is a very small and simple client.

picocom -b 115200 /dev/ttyUSB0

Screen is a terminal multiplexer which happens to have serial support.

screen /dev/ttyUSB0 115200

Or a very commonly used client is minicom which is quite powerful:

minicom -s
  • Navigate to 'serial port setup'
  • Type "a" and change location of serial device to '/dev/ttyUSB0' then hit "enter"
  • If needed, modify the settings to match this and hit "esc" when done:
     E - Bps/Par/Bits          : 115200 8N1
     F - Hardware Flow Control : No
     G - Software Flow Control : No
  • Navigate to 'Save setup as dfl', hit "enter", and then "esc"

Console from Windows

Putty is a small simple client available for download here. Open up Device Manager to determine your console port. See the putty configuration image for more details.

Device Manager Putty Configuration


Initrd / Busybox / Fastboot

When the board first boots you should see output similar to this:

 >> TS-BOOTROM - built Jan 24 2011 12:40:54
 >> Copyright (c) 2010, Technologic Systems
 >> Booting from SD card...
 .
 .
 .
 Finished booting in 1.11 seconds
 Type 'tshelp' for help

This is a busybox shell which presents you with a very minimalistic system. This filesystem is loaded into memory, so none of the changes will be saved unless you type the command

save

or mount a filesystem as read/write. This can also provide a simple mechanism for running your application in an entirely read-only environment. The linuxrc script will be the first thing executed as soon as the kernel is loaded. This sets the default IP address, loads a reloadable FPGA bitstream if one is present, starts the userspace ctl applications, and more. Read the linuxrc for more information.

While busybox itself doesn't contain much functionality, it does mount the Debian partition under /mnt/root/. It will also add common paths and load libraries from the Debian system. Many of the Debian applications will work by default. Whether or not a Debian application will work in fastboot needs to be judged per application. If an application relies on certain paths being in certain places, or running services, you should instead boot to Debian to run them.

This shell when started on the COM port is what is blocking a Debian boot. If you close it by typing

exit

the boot process will continue. If you are connected through telnet, this will instead open up its own instance of the shell so typing

exit

will only end that session. Through any connection method you can relink the linuxrc to change it to boot by default to Debian.

The initrd has these boot scripts available:

Script Function
linuxrc-fastboot (default) Boots immediately to a shell in ramdisk. This will mount whichever boot medium you have selected to /mnt/root/. When you type 'exit', it will boot to that medium.
linuxrc-sdroot Boots immediately to the Debian stored on SD.
linuxrc-xnandroot Boots immediately to the Debian stored on the XNAND.
linuxrc-sdroot-ubuntu Boots immediately to the first partition which contains Ubuntu. This is only available on the 8GB SD cards.
Note: Keep in mind the boot medium is selected by the pinout on your baseboard, not through software. The ramdisk and kernel will be loaded before the linuxrc begins execution.

For example, to set the linuxrc to boot immediately to Debian on SD or NAND, you would run this:

rm linuxrc; ln -s /linuxrc-sdroot /linuxrc; save

You can edit the linuxrc-4800 to create more booting methods (NFS, USB, etc).

The small default initrd is only 2Mbyte but there is space for approximately 300 Kbyte of additional user applications. The binaries on the initrd are dynamically linked against embedded Linux's "uclibc" library instead of the more common Linux C library "glibc". "uclibc" is a smaller version of the standard C library optimized for embedded systems and requires a different set of GCC compiler tools which are available here.

 The compiled instance of busybox includes several internal commands listed below:
 BusyBox v1.14.2 (2011-02-03 15:49:11 MST) multi-call binary
 Copyright (C) 1998-2008 Erik Andersen, Rob Landley, Denys Vlasenko
 and others. Licensed under GPLv2.
 See source distribution for full notice.
 
 Usage: busybox [function] [arguments]...
    or: function [arguments]...
 
         BusyBox is a multi-call binary that combines many common Unix
         utilities into a single executable.  Most people will create a
         link to busybox for each function they wish to use and BusyBox
         will act like whatever it was invoked as!
 
 Currently defined functions:
         [, [[, ar, ash, basename, cat, chat, chgrp, chmod, chown, chroot,
         cmp, cp, cpio, cttyhack, cut, date, dd, depmod, devmem, df, dirname,
         dmesg, du, echo, egrep, env, expr, false, fdisk, fgrep, find, grep,
         gunzip, gzip, halt, head, hostname, hush, ifconfig, insmod, kill,
         killall, ln, login, ls, lsmod, md5sum, mdev, mkdir, mknod, modprobe,
         more, mount, msh, mv, netstat, ping, pivot_root, poweroff, printf,
         ps, pwd, reboot, rm, rmdir, rmmod, route, rx, sed, setconsole,
         setsid, sh, sleep, stty, sync, tail, tar, telnetd, test, tftp,
         top, tr, true, udhcpc, umount, uname, unzip, usleep, uudecode,
         uuencode, vi, wget, xargs, yes, zcat

Also on the initrd are the TS specific applications: canctl, dioctl, nandctl, spictl, ts4800ctl, and xuartctl. We also provide the ts.subr which provides the following functions:

 bit_set()
 bit_clr()
 bit_get()
 gpio_dir_get()
 gpio_dir_set()
 gpio_data_get()
 gpio_data_set()
 dio_dir_get()
 dio_dir_set()
 dio_data_get()
 dio_data_set()
 usb_on()
 usb_off()
 usb_init()
 usb_numports()
 usb_port_devexists()
 usbload()
 bbclk_on()
 bbclk_off()
 led0()
 led1()
 lcd_on()
 lcd_off()
 backlite_on()
 backlite_off()
 backlite_high()
 backlite_medium()
 backlite_low()
 fix_display()
 touchscreen_on()
 touchscreen_off()
 tpc_up()
 can0_on()
 can0_off()
 can1_on()
 can1_off()
 xuart0_on()
 xuart0_off()
 xuart3_on()
 xuart3_off()
 xuart4_on()
 xuart4_off()
 xuart5_on()
 xuart5_off()
 spi_on()
 spi_off()
 motor_on()
 motor_off()
 snd_on()
 snd_off()
 irq5_on()
 irq5_off()
 irq6_on()
 irq6_off()
 irq7_on()
 irq7_off()
 spk_on()
 spk_off()
 is_ts4800
 mxtime()
 save2sd
 save2xnand
 save
 sd2xnand
 xnand2sd
 createxnandboot
 createxnandroot()
 get_2nd_mac()
 tshelp()
 sdmount()
 help()

By default, linuxrc will not insert the necessary modules into the kernel to mount and use USB devices within the initrd/busybox environment if there is no USB device present upon bootup (USB support is enabled by default within the Debian environment). The quickest way to get a USB device (like a USB thumb drive) to mount in the initrd/busybox environment is to ensure that it is plugged in before the SBC is powered up. In order to get hot-swappable USB devices regardless of device presence at bootup time, you must "modprobe" the necessary modules. This has been done for you in the ts.subr file with the usbload() function.

Boot Process

Boot Process

This board uses the TS-BOOTROM implemented in our FPGA. When the board is powered on the FPGA checks the state of the boot jumpers and then begins execution in the MBR of the selected storage device. By default any boot device will have a kernel, and a ramdisk with busybox. On the SD card and XNAND there is a copy of Debian.


Backup / Restore

If you are using a Windows workstation there is no support for writing directly to block devices. However, as long as one of your booting methods still can boot a kernel and the initrd you can rewrite everything by using a usb drive. This is also a good way to blast many stock boards when moving your product into production. You can find more information about this method with an example script here.

Note: Note that the MBR installed by default on this board contains a 446 byte bootloader program that loads the initial power-on kernel and initrd from the first and second partitions. Replacing it with an MBR found on a PC would not work as a PC MBR contains an x86 code bootup program.

MicroSD Card

If backing up on a separate workstation, keep in mind windows does not have direct block device support needed to write these images. You will also need to determine the SD card device. You can usually find this in the output of 'dmesg' after inserting the SD card and you will typically see something like '/dev/sdb' as the block device and '/dev/sdb1' for the first partition. On some newer kernels you will see '/dev/mmcblk0' as the block device and '/dev/mmcblkop1' for the first partition. For these examples I will use the '/dev/mmcblk0' format.

If you are backing up directly on the board you will likely need to use some kind of offboard storage like a thumbdrive or external hard drive. Make sure you have any nbd devices unmounted before trying to restore new ones.

It is always recommended to use the latest image. You should use this 2GB SD image and this 8GB SD image.

Make sure you decompress the image first before writing.

Note: Not all SD cards are created equally, over time they tend to shrink in size due to automatic retiring of bad blocks. All of Technologic System's images are 10% smaller than the target disc size. We STRONGLY recommend following that same practice on any mass-replicated images.

From Workstation


Backup

Entire SD card

dd if=/dev/mmcblk0 of=/path/to/backup.dd bs=32k

Kernel

dd if=/dev/mmcblk0p2 of=/path/to/zImage bs=32k

Initrd

dd if=/dev/mmcblk0p3 of=/path/to/initrd bs=32k

Restore

Entire SD card

dd if=/path/to/backup.dd of=/dev/mmcblk0 bs=32k

Kernel

dd if=/path/to/zImage bs=32k of=/dev/mmcblk0p2

Initrd

dd if=/initrd bs=32k of=/dev/mmcblk0p3

From SBC


Backup

Entire card

dd if=/dev/mmcblk0 of=/path/to/backup.dd
Note: Not all SD cards are created equally, over time they tend to shrink in size due to automatic retiring of bad blocks. All of Technologic System's images are 10% smaller than the target disc size. We STRONGLY recommend following that same practice on any mass-replicated images.

Kernel

dd if=/dev/mmcblk0p2 of=/path/to/backup.dd

Initrd

dd if=/dev/mmcblk0p3 of=/path/to/backup.dd

Restore

The entire card from SBC

dd if=/path/to/2GB-mSD-4800-latest.dd of=/dev/mmcblk0

Kernel

dd if=/mnt/root/zImage of=/dev/mmcblk0p2

Initrd

dd if=/mnt/root/initrd of=/dev/mmcblk0p3

Operating System

Our boards boot a standard Debian Squeeze (EABI) distribution which provides a large amount of software that you can install with relatively little effort. See the Debian page for more general information on installing/removing software, and further documentation.

Software Development

GCC options to use the FPU:

 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -ftree-vectorize -mfloat-abi=softfp