<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wikilegacy.armadeus.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=SebastienR</id>
	<title>ArmadeusWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://wikilegacy.armadeus.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=SebastienR"/>
	<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Special:Contributions/SebastienR"/>
	<updated>2026-06-12T01:05:40Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Bluetooth&amp;diff=14754</id>
		<title>Bluetooth</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Bluetooth&amp;diff=14754"/>
		<updated>2019-01-22T14:18:25Z</updated>

		<summary type="html">&lt;p&gt;SebastienR: /* OPOS6UL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page will give you all the informations needed to have a running Bluetooth configuration on your Armadeus board.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
First you have to get a compatible hardware. Currently there are 5 solutions:&lt;br /&gt;
* You have an [[OPOS6UL]] board with the Wi-Fi/Bluetooth chip integrated.&lt;br /&gt;
* You have an [[APF6]] board with the Wi-Fi/Bluetooth chip integrated. The chip is on the [[APF6]] Dual and Quad boards by default.&lt;br /&gt;
* You have an [[APF51Dev]] board, then you&#039;re a lucky man because Bluetooth is integrated on the board ;-)&lt;br /&gt;
* If you have an [[APF27Dev]], then you can get a [[Wireless extension board]] with Wi-Fi/Bluetooth option from Armadeus Systems&lt;br /&gt;
* Otherwise: get a cheap USB&amp;lt;-&amp;gt;Bluetooth adapter (requires an USB Host port) or a RS232&amp;lt;-&amp;gt;Bluetooth adapter&lt;br /&gt;
&lt;br /&gt;
===Tested USB adapters===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; summary=&amp;quot;Supported USB&amp;lt;-&amp;gt;Bluetooth dongle&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#efefef;&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Model&#039;&#039;&#039; || colspan=&amp;quot;2&amp;quot; | &#039;&#039;&#039;Status&amp;lt;br&amp;gt; APF9328 / APF27&#039;&#039;&#039; ||&#039;&#039;&#039;Chipset&#039;&#039;&#039; || &#039;&#039;&#039;Comments&#039;&#039;&#039;&lt;br /&gt;
|----------------&lt;br /&gt;
|&#039;&#039;&#039;BELKIN - Mini Bluetooth Adapter&#039;&#039;&#039; [[Image:Belkin_Mini_Bluetooth.jpg]] || style=&amp;quot;background:#ffff00;&amp;quot; | TBT || style=&amp;quot;background:#ff0000;&amp;quot; | KO || Product: BLUETOOTH USB +EDR ADAPTER v2.1 UHE &amp;lt;br&amp;gt; Manufacturer: Broadcom Corp&lt;br /&gt;
  || # hciconfig hci1 up piscan&lt;br /&gt;
btusb_submit_intr_urb: hci1 urb c3bdac40 submission failed (28)&amp;lt;br&amp;gt;&lt;br /&gt;
Can&#039;t init device hci1: Input/output error (5)&lt;br /&gt;
&lt;br /&gt;
|----------------&lt;br /&gt;
|&#039;&#039;&#039;TRUST - Bluetooth 2.1 USB Adapter&#039;&#039;&#039; [[Image:Trust_Small_Bluetooth.jpg]] || style=&amp;quot;background:#ffff00;&amp;quot; | TBT || style=&amp;quot;background:#ff0000;&amp;quot; | KO || Product: BCM2046B1 &amp;lt;br&amp;gt; Manufacturer: Broadcom ||  # hciconfig hci1 up piscan&lt;br /&gt;
btusb_submit_intr_urb: hci1 urb c3bdac40 submission failed (28)&amp;lt;br&amp;gt;&lt;br /&gt;
Can&#039;t init device hci1: Input/output error (5)&lt;br /&gt;
|----------------&lt;br /&gt;
|&#039;&#039;&#039;[http://www.rueducommerce.fr/Peripheriques-Reseaux-wifi/Adaptateur-USB-Bluetooth/Adaptateur-USB-Bluetooth/RUEDUCOMMERCE/2848164-Mini-adaptateur-USB-Bluetooth-portee-100m-19x15x5-39-mm.htm RUEDUCOMMERCE - Mini adaptateur USB Bluetooth&#039;&#039;&#039;] [[Image:RDC_USB_Bluetooth.jpg]]|| style=&amp;quot;background:#ffff00;&amp;quot; | TBT || style=&amp;quot;background:#00ff00;&amp;quot; | OK || Manufacturer: Cambridge Silicon Radio || &lt;br /&gt;
|----------------&lt;br /&gt;
|&#039;&#039;&#039;GIGABYTE - GN-BTD01&#039;&#039;&#039; [[Image:Gigabyte_gn-btd01.jpg]]|| style=&amp;quot;background:#ffff00;&amp;quot; | TBT || style=&amp;quot;background:#00ff00;&amp;quot; | OK || Manufacturer: Cambridge Silicon Radio || Bluetooth 1.1 ?&lt;br /&gt;
|----------------&lt;br /&gt;
|&#039;&#039;&#039;BELKIN - F8T003 v2&#039;&#039;&#039; || style=&amp;quot;background:#ffff00;&amp;quot; | TBT || style=&amp;quot;background:#00ff00;&amp;quot; | OK || Manufacturer: Cambridge Silicon Radio || &lt;br /&gt;
|----------------&lt;br /&gt;
|&#039;&#039;&#039;D-LINK - DBT-122&#039;&#039;&#039; || style=&amp;quot;background:#ffff00;&amp;quot; | TBT || style=&amp;quot;background:#00ff00;&amp;quot; | OK || Product: BCM2035 &amp;lt;br&amp;gt; Manufacturer: Broadcom || &lt;br /&gt;
|----------------&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
Bluetooth Linux stack is divided into several parts:&lt;br /&gt;
* kernel drivers&lt;br /&gt;
* userland libraries/daemon (bluez)&lt;br /&gt;
&lt;br /&gt;
===Driver installation===&lt;br /&gt;
* (Done by default on [[APF27]], [[APF51]], [[APF6]] and [[OPOS6UL]])&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make linux-menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
[*] Networking support  ---&amp;gt;&lt;br /&gt;
    &amp;lt;M&amp;gt;   Bluetooth subsystem support  ---&amp;gt;&lt;br /&gt;
        --- Bluetooth subsystem support&lt;br /&gt;
            &amp;lt;M&amp;gt;   L2CAP protocol support &lt;br /&gt;
            &amp;lt;M&amp;gt;   SCO links support&lt;br /&gt;
            &amp;lt;M&amp;gt;   RFCOMM protocol support&lt;br /&gt;
                [*]     RFCOMM TTY support&lt;br /&gt;
            &amp;lt;M&amp;gt;   BNEP protocol support&lt;br /&gt;
                [ ]     Multicast filter support (NEW)&lt;br /&gt;
                [ ]     Protocol filter support (NEW)&lt;br /&gt;
            &amp;lt;M&amp;gt;   HIDP protocol support&lt;br /&gt;
            Bluetooth device drivers  ---&amp;gt;&lt;br /&gt;
                &amp;lt;M&amp;gt; HCI USB driver &lt;br /&gt;
                &amp;lt; &amp;gt; HCI SDIO driver (NEW)&lt;br /&gt;
                &amp;lt;M&amp;gt; HCI UART driver&lt;br /&gt;
                    [*]   UART (H4) protocol support &lt;br /&gt;
                    [*]   BCSP protocol support &lt;br /&gt;
                    [ ]   HCILL protocol support (NEW)&lt;br /&gt;
                &amp;lt; &amp;gt; HCI BCM203x USB driver (NEW)&lt;br /&gt;
                &amp;lt; &amp;gt; HCI BPA10x USB driver (NEW)&lt;br /&gt;
                &amp;lt; &amp;gt; HCI BlueFRITZ! USB driver (NEW)&lt;br /&gt;
                &amp;lt; &amp;gt; HCI VHCI (Virtual HCI device) driver (NEW)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Bluez installation===&lt;br /&gt;
(Done by default on [[APF51]], [[APF6]] and [[OPOS6UL]])&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    [*] XML handling  ---&amp;gt;&lt;br /&gt;
        [*]   libxml2&lt;br /&gt;
    ...&lt;br /&gt;
    [*] Hardware handling  ---&amp;gt;&lt;br /&gt;
        [*]   dbus&lt;br /&gt;
              XML library to use (libxml2)&lt;br /&gt;
    ...&lt;br /&gt;
    Networking applications  ---&amp;gt;&lt;br /&gt;
    [*] bluez&lt;br /&gt;
    [*] bluez-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Custom Bring up (each hardware may have a different init sequence)==&lt;br /&gt;
&lt;br /&gt;
===OPOS6UL===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; summary=&amp;quot;put summary here&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#efefef;&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! width=&amp;quot;50%&amp;quot; | OPOS6UL !! width=&amp;quot;50%&amp;quot; | OPOS6ULNANO&lt;br /&gt;
|-&lt;br /&gt;
| OPOS6UL has a CM-43438 chip (based on BCM43438), connected to the i.MX6UL UART8 (&#039;&#039;/dev/ttymxc7&#039;&#039;)&lt;br /&gt;
| OPOS6ULNANO has a Murata module with CYM4343 chipset, connected to the i.MX6UL UART3 (&#039;&#039;/dev/ttymxc2&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;# export BTRESET=42&amp;lt;/pre&amp;gt; &amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;# export BTDEV=/dev/ttymxc7&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;# export BTRESET=99&amp;lt;/pre&amp;gt; &amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;# export BTDEV=/dev/ttymxc2&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Start the bluetooth deamon and attach your chipset to the kernel bluez UART driver:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# /usr/libexec/bluetooth/bluetoothd &amp;amp;&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Wake up the chip&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# echo $BTRESET &amp;gt; /sys/class/gpio/export&lt;br /&gt;
# echo out &amp;gt; /sys/class/gpio/gpio$BTRESET/direction&lt;br /&gt;
# echo 0 &amp;gt; /sys/class/gpio/gpio$BTRESET/value&lt;br /&gt;
# sleep 1&lt;br /&gt;
# echo 1 &amp;gt; /sys/class/gpio/gpio$BTRESET/value&lt;br /&gt;
# sleep 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Attach the chip. Before running the following command, be sure that the file &#039;&#039;/etc/firmware/BCM43430A1.hcd&#039;&#039; exists (if not, it can be obtained (wget) [https://github.com/OpenELEC/misc-firmware/blob/master/firmware/brcm/BCM43430A1.hcd here ?] or [https://aur.archlinux.org/cgit/aur.git/plain/BCM43430A1.hcd?h=pi-bluetooth here]) !&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# hciattach -t 30 $BTDEV bcm43xx 921600 flow&lt;br /&gt;
bcm43xx_init&lt;br /&gt;
Set Controller UART speed to 921600 bit/s&lt;br /&gt;
Flash firmware /etc/firmware/BCM43430A1.hcd&lt;br /&gt;
Set Controller UART speed to 921600 bit/s&lt;br /&gt;
Device setup complete&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* To choose bluetooth MAC address, add it to &#039;&#039;hciattach&#039;&#039; command&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# hciattach -t 30 $BTDEV bcm43xx 921600 flow bdaddr 11:22:33:44:55:66&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* [[Bluetooth#Common Bring up|Go to &amp;quot;Common Bring up&amp;quot; section]]&lt;br /&gt;
&lt;br /&gt;
===APF6===&lt;br /&gt;
* APF6 has a jorjin chip connected to the i.MX6 UART2 (ttymxc1)&lt;br /&gt;
&lt;br /&gt;
* Start the bluetooth deamon and attach your chipset to the kernel bluez UART driver:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# /usr/sbin/bluetoothd&lt;br /&gt;
NET: Registered protocol family 31&lt;br /&gt;
Bluetooth: HCI device and connection manager initialized&lt;br /&gt;
Bluetooth: HCI socket layer initialized&lt;br /&gt;
Bluetooth: L2CAP socket layer initialized&lt;br /&gt;
Bluetooth: SCO socket layer initialized&lt;br /&gt;
Bluetooth: BNEP (Ethernet Emulation) ver 1.3&lt;br /&gt;
Bluetooth: BNEP socket layer initialized&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or if you are using BlueZ 5&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# /usr/libexec/bluetooth/bluetoothd &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Wake up the chip&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# export BTRESET=43&lt;br /&gt;
# echo $BTRESET &amp;gt; /sys/class/gpio/export&lt;br /&gt;
# echo out &amp;gt; /sys/class/gpio/gpio$BTRESET/direction&lt;br /&gt;
# echo 0 &amp;gt; /sys/class/gpio/gpio$BTRESET/value&lt;br /&gt;
# sleep 1&lt;br /&gt;
# echo 1 &amp;gt; /sys/class/gpio/gpio$BTRESET/value&lt;br /&gt;
# sleep 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Attach the chip. Before running the following command, be sure that the file &#039;&#039;/lib/firmware/TIInit_7.6.15.bts&#039;&#039; exists ! You can download it [https://github.com/TI-ECS/bt-firmware/blob/master/TIInit_7.6.15.bts here] (click on the &#039;Raw&#039; button)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# /usr/sbin/hciattach -s 115200 ttymxc1 texas 115200&lt;br /&gt;
Found a Texas Instruments&#039; chip!&lt;br /&gt;
Firmware file : /lib/firmware/TIInit_7.6.15.bts&lt;br /&gt;
Loaded BTS script version 1&lt;br /&gt;
Device setup complete&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[Bluetooth#Common Bring up|Go to &amp;quot;Common Bring up&amp;quot; section]]&lt;br /&gt;
&lt;br /&gt;
===APF51Dev===&lt;br /&gt;
* [[APF51Dev]] has a CSR BlueCore 4 chipset connected to the i.MX51 UART3 (ttymxc1)&lt;br /&gt;
&lt;br /&gt;
* On recent kernel using device tree, you have to &amp;quot;wake up&amp;quot; the chip:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# export BTRESET=60&lt;br /&gt;
# echo $BTRESET &amp;gt; /sys/class/gpio/export&lt;br /&gt;
# echo out &amp;gt; /sys/class/gpio/gpio$BTRESET/direction&lt;br /&gt;
# echo 0 &amp;gt; /sys/class/gpio/gpio$BTRESET/value&lt;br /&gt;
# sleep 1&lt;br /&gt;
# echo 1 &amp;gt; /sys/class/gpio/gpio$BTRESET/value&lt;br /&gt;
# sleep 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Start the bluetooth deamon and attach your chipset to the kernel bluez UART driver:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# /usr/sbin/bluetoothd&lt;br /&gt;
# /usr/sbin/hciattach -s 115200 ttymxc1 csr 115200&lt;br /&gt;
&lt;br /&gt;
CSR build ID 0x00-0x37&lt;br /&gt;
Bluetooth: Core ver 2.15&lt;br /&gt;
NET: Registered protocol family 31&lt;br /&gt;
Bluetooth: HCI device and connection manager initialized&lt;br /&gt;
Bluetooth: HCI socket layer initialized&lt;br /&gt;
Bluetooth: HCI UART driver ver 2.2&lt;br /&gt;
Bluetooth: HCI H4 protocol initialized&lt;br /&gt;
Bluetooth: HCI BCSP protocol initialized&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[Bluetooth#Common Bring up|Go to &amp;quot;Common Bring up&amp;quot; section]]&lt;br /&gt;
&lt;br /&gt;
===APF27Dev + APW===&lt;br /&gt;
* [[Wireless extension board|APW]] has a CSR BlueCore 4 chipset connected to the i.MX27 serial port ttySMX5 (UART6)&lt;br /&gt;
* Reset it:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# source /usr/bin/gpio_helpers.sh&lt;br /&gt;
# gpio_mode PB14 1&lt;br /&gt;
# gpio_set_value PB14 0; sleep 1; gpio_set_value PB14 1; sleep 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Attach it to the kernel bluez UART driver:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# /usr/sbin/hciattach -s 921600 ttySMX5 csr 921600&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* [[Bluetooth#Common Bring up|Go to &amp;quot;Common Bring up&amp;quot; section]]&lt;br /&gt;
&lt;br /&gt;
===USB module===&lt;br /&gt;
* Make sure your hardware is connected to the APF. &#039;&#039;&#039;If using an USB dongle&#039;&#039;&#039;, load corresponding driver:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# modprobe btusb&lt;br /&gt;
Bluetooth: Core ver 2.14&lt;br /&gt;
NET: Registered protocol family 31&lt;br /&gt;
Bluetooth: HCI device and connection manager initialized&lt;br /&gt;
Bluetooth: HCI socket layer initialized&lt;br /&gt;
Bluetooth: Generic Bluetooth USB driver ver 0.4&lt;br /&gt;
usbcore: registered new interface driver btusb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Common Bring up==&lt;br /&gt;
* Now that your hardware Bluetooth interface is up, check if it was correctly detected by BlueZ:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# hciconfig&lt;br /&gt;
hci0:   Type: USB or UART&lt;br /&gt;
        BD Address: 00:00:00:00:00:00 ACL MTU: 0:0 SCO MTU: 0:0&lt;br /&gt;
        DOWN&lt;br /&gt;
        RX bytes:0 acl:0 sco:0 events:0 errors:0&lt;br /&gt;
        TX bytes:0 acl:0 sco:0 commands:0 errors:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* If interface is DOWN, bring it up:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# hciconfig hci0 up piscan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Check your Bluetooth device is correctly initialized:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# hcitool dev&lt;br /&gt;
Devices:&lt;br /&gt;
        hci0    00:10:60:D1:92:0F&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* From Bluez5, everything can now be done with &#039;&#039;bluetoohctl&#039;&#039; interactive command:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# bluetoothctl &lt;br /&gt;
[NEW] Controller 5C:F3:70:34:D6:66 BlueZ 5.43 [default]&lt;br /&gt;
[bluetooth]# power on&lt;br /&gt;
Changing power on succeeded&lt;br /&gt;
[CHG] Controller 5C:F3:70:34:D6:66 Powered: yes&lt;br /&gt;
&lt;br /&gt;
[bluetooth]# scan on&lt;br /&gt;
Discovery started&lt;br /&gt;
[CHG] Controller 5C:F3:70:34:D6:66 Discovering: yes&lt;br /&gt;
&lt;br /&gt;
[bluetooth]# agent on&lt;br /&gt;
Agent registered&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
===Scanning network===&lt;br /&gt;
* To get surrounding devices addresses and names:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# hcitool scan&lt;br /&gt;
Scanning ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* To get surrounding devices addresses and classes:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# hcitool inq&lt;br /&gt;
Inquiring ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Get info on a given device===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# hcitool info 00:19:0E:xx:xx:xx&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Pinging other devices===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# l2ping 00:19:0E:xx:xx:xx&lt;br /&gt;
Ping: 00:19:0E:xx:xx:xx from 00:19:88:xx:xx:xx (data size 44) ...&lt;br /&gt;
44 bytes from 00:19:0E:xx:xx:xx id 0 time 38.05ms&lt;br /&gt;
44 bytes from 00:19:0E:xx:xx:xx id 1 time 37.09ms&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Here 00:19:0E:xx:xx:xx is the Bluetooth MAC address of the Host.&lt;br /&gt;
&lt;br /&gt;
===Change advertising name===&lt;br /&gt;
* to change your module&#039;s name on Bluetooth network:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# hciconfig hci0 name ARMADEUS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* From bluez5, you can also specify advertising name in &#039;&#039;/etc/bluetooth/main.conf&#039;&#039; file (%h = hostname, %d = device number):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
[General]&lt;br /&gt;
Name = OPOS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Advanced usages: Setup a Terminal between a PC and your APF through Bluetooth==&lt;br /&gt;
===On the APF===&lt;br /&gt;
* the first step is to create the corresponding node for the future connection:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# mknod /dev/rfcomm0 c 216 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then, listen to an incoming connection, on the &#039;&#039;rfcomm0&#039;&#039; (here channel 7 is chosen):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# rfcomm -i hci0 listen /dev/rfcomm0 7 &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Note|If RFCOMM protocol is not built statically in your kernel, you might need to load it before use with: &amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;# modprobe rfcomm &amp;lt;/pre&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Note|If you plan to connect from your smartphone, don&#039;t specify a channel number as most apps will try to connect to channel 1: &amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;# rfcomm -i hci0 listen /dev/rfcomm0 &amp;amp;&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
* and the last step, when the connection is open, is to connect a terminal (through getty) to the device &#039;&#039;/dev/rfcomm0&#039;&#039;:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# getty 38400 /dev/rfcomm0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===On your Host PC===&lt;br /&gt;
* after the two first steps on the APF, you need to connect the PC to the APF with the same channel (7):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ rfcomm connect 0 00:19:88:2B:xx:xx 7             (replace 00:19:88:2B:xx:xx with the Bluetooth @ of your APF)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* and configure &#039;&#039;minicom&#039;&#039; (&#039;&#039;$HOME/.minirc.dfl&#039;&#039;):&lt;br /&gt;
 pu port             /dev/rfcomm0&lt;br /&gt;
 pu baudrate         38400&lt;br /&gt;
 pu bits             8&lt;br /&gt;
 pu parity           N&lt;br /&gt;
 pu stopbits         1&lt;br /&gt;
* when &#039;&#039;getty&#039;&#039; is running on the APF/OPOS, you could you connect with &#039;&#039;minicom&#039;&#039;:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ minicom -o&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* it could be a good idea to create an additional user account for remotely login through Bluetooth, by following [[Adding_users|these instructions]].&lt;br /&gt;
&lt;br /&gt;
===On your Android smartphone===&lt;br /&gt;
* install BlueTerm app&lt;br /&gt;
* connect to right Bluetooth device... that&#039;s it ;-)&lt;br /&gt;
&lt;br /&gt;
==Advanced usages: Using a Bluetooth keyboard on your APF==&lt;br /&gt;
The only thing needed after having a Bluetooth correctly configured is to use this command :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# hidd --connect keyboard_bdaddr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Advanced usages: Controlling your board from an android device (using rfcomm)==&lt;br /&gt;
&lt;br /&gt;
===With your own App===&lt;br /&gt;
The following section shows how to send commands to the board from an android device via Bluetooth. The goal is to control the two LEDs present on the board. An [[APF51Dev]] and a Samsung Galaxy Tab 2 are used in this example.&lt;br /&gt;
&lt;br /&gt;
On the APF:&lt;br /&gt;
&lt;br /&gt;
* Enable the SPP profile. Here, it is using the channel 1.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# sdptool add --channel=1 SP&lt;br /&gt;
Serial Port service registered&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Listen incoming connections on the channel 1. The script &#039;&#039;serial-server.sh&#039;&#039; is located in &#039;&#039;demos/android/android_remote_controller&#039;&#039;.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# rfcomm listen hci0 1 ./serial-server.sh {}&lt;br /&gt;
Waiting for connection on channel 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the android device:&lt;br /&gt;
&lt;br /&gt;
* Deploy the app on your device. The app is available [ftp://ftp2.armadeus.com/armadeusw/apf-remote-controller.tar.gz here as source] or [ftp://ftp2.armadeus.com/armadeusw/apf-remote-controller.apk here as apk].&lt;br /&gt;
* Start the app.&lt;br /&gt;
* Enjoy :-)&lt;br /&gt;
&lt;br /&gt;
===With Bluetooth Electronics App===&lt;br /&gt;
* This application from [http://www.keuwl.com/apps/bluetoothelectronics/ keuwl.com], can be found on Google store and is very practical to design control panel on your Android device and make then control your Bluetooh device). It is generally used with Arduino and HC-06 Bluetooth module but we will see it works perfectly on APF/OPOS SoM.&lt;br /&gt;
* Bluetooth Electronics uses RFCOMM to talk with device and so communication can be seen as a serial port&lt;br /&gt;
* Again, use &#039;&#039;rfcomm&#039;&#039; command line tool to listen for your Android device connection:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
[bluetooth]# power on&lt;br /&gt;
...&lt;br /&gt;
# rfcomm -i hci0 listen /dev/rfcomm0 &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Discover/pair/connect the APF/OPOS SoM from Bluetooth Electronics app&lt;br /&gt;
* Then configure &#039;&#039;/dev/rfcomm0&#039;&#039; created by rfcomm:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# stty -F /dev/rfcomm0 raw -echo -echoe -echok 9600&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* and use this new serial port from your application...&lt;br /&gt;
* here a sample application is given; it runs on [[OPOS6UL]] and allows to light on/off the user LED, get processor temperature, get CPU usage and send text to LCD from Bluetooth Electronics panel. Serial protocol is very simple and can be guessed from [https://sourceforge.net/p/armadeus/code/ci/master/tree/target/demos/android/bluetooth-electronics/opos6ul-server.py source code].&lt;br /&gt;
&lt;br /&gt;
[[File:Bluetooth_Electronics.png]]&lt;br /&gt;
&lt;br /&gt;
==Advanced usages: Others==&lt;br /&gt;
* [[TCP/IP with Bluetooth]]&lt;br /&gt;
* [[OBEX]] transfers&lt;br /&gt;
* [[Wiimote]]&lt;br /&gt;
&lt;br /&gt;
{{Note|On iOS, it is &#039;&#039;&#039;not&#039;&#039;&#039; possible to use standard Bluetooth devices that are not registered through [https://developer.apple.com/programs/mfi/ MFi Program]. The only way to communicate with your modules is to have a Bluetooth Low Energy interface and corresponding iOS software}}&lt;br /&gt;
&lt;br /&gt;
==Bluetooth Low Energy (BLE)==&lt;br /&gt;
* This protocol enhancement for low energy networks is only available on [[APF6]], [[OPOS6UL]] and [[OPOS6UL_NANO]] modules with corresponding Wi-Fi+BLE hardware option.&lt;br /&gt;
&lt;br /&gt;
* To scan for BLE devices (&#039;&#039;hci0&#039;&#039; interface should be up):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# hcitool hci0 lescan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Most operations can then be done with &#039;&#039;bluetoothctl&#039;&#039;:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# bluetoothctl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===APF/OPOS as BLE device===&lt;br /&gt;
* Most of the job consist in developing a GATT server implementing desired functionalities/characteristics. Some examples are given in Bluez sources. For example (&#039;&#039;python&#039;&#039; is needed and &#039;&#039;bluetoothd&#039;&#039; should have been launched with &#039;&#039;--experimental&#039;&#039; option):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# hciconfig hci0 up&lt;br /&gt;
# /root/example-gatt-server&lt;br /&gt;
# hciconfig hci0 leadv         (to start BLE Advertising)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* You can then use &#039;&#039;BLE Scanner&#039;&#039; or &#039;&#039;LightBlue&#039;&#039; Android/iOS app.&lt;br /&gt;
* For &amp;quot;iBeacon&amp;quot; stuff, [http://www.wadewegner.com/2014/05/create-an-ibeacon-transmitter-with-the-raspberry-pi/ this tutorial] may serve as a starting example.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* http://www.bluez.org/&lt;br /&gt;
* http://www.hanscees.com/bluezhowto.html&lt;br /&gt;
* [http://doc.ubuntu-fr.org/bluetooth_materiel-soutenu Dongle USB&amp;lt;-&amp;gt;Bluetooth supportés sous Ubuntu]&lt;br /&gt;
* [http://www.unixgarden.com/index.php/comprendre/bluetooth-installation-et-utilisation GLMF n°88 - Bluetooth, installation et utilisation]&lt;br /&gt;
* [http://www.unixgarden.com/index.php/embarque/communication-de-donnees-et-d’images-issues-de-la-carte-fox-par-bluetooth GLMF n°95 - Communication de données et d&#039;images issues de la carte Fox par Bluetooth]&lt;br /&gt;
&lt;br /&gt;
[[Category:Wireless]]&lt;br /&gt;
[[Category:Bluetooth]]&lt;/div&gt;</summary>
		<author><name>SebastienR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Debian_on_APF&amp;diff=12941</id>
		<title>Debian on APF</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Debian_on_APF&amp;diff=12941"/>
		<updated>2015-02-04T09:07:03Z</updated>

		<summary type="html">&lt;p&gt;SebastienR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
This page details how to install Debian on an APF27/APF28/APF51/APF6.&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* an APF board (with corresponding docking board)&lt;br /&gt;
* a development PC running linux&lt;br /&gt;
* the debootstrap program installed on the development PC&lt;br /&gt;
* the qemu-user ARM statically linked on the development PC&lt;br /&gt;
* about an hour of free time&lt;br /&gt;
&lt;br /&gt;
==Preparing the development PC==&lt;br /&gt;
* In this tutorial, we have used Ubuntu 11.10 on the development PC. Any other distribution can be used with some adjustments but of course, Debian based distributions are recommended.&lt;br /&gt;
&lt;br /&gt;
* Let&#039;s first install all the packages that will be used :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install debootstrap qemu-user-static&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* then get in a root shell and prepare a work folder:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo su&lt;br /&gt;
# mkdir /root/apf_debian&lt;br /&gt;
# cd /root/apf_debian&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bootstrapping the Debian filesystem==&lt;br /&gt;
&lt;br /&gt;
* The debootstrap command is generating a base debian filesystem by downloading all debian base packages and unpacking them in a folder, in order to build a fresh debian root filesystem.&lt;br /&gt;
* Installing deb packages is not only extracting archive files, it also consists in running scripts after unpacking the files. Running these scripts is handled by the script interpreters that have been unpacked in the generated folders. Therefore generating an ARM debian filesystem on an x86 based computer requires to do this in two steps.&lt;br /&gt;
* Let&#039;s run the first step. That one consists in downloading all the deb packages and unpacking the files, but without running the scripts :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
# debootstrap --foreign --arch=armel squeeze rootfs http://ftp.debian.org/debian &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The foreign option makes debootstrap stop right after unpacking. The arch option specifies the architecture we want to make a rootfs for, armel is the name of the ARM port of debian. Then in order we have squeeze, which is the name of the debian version we want to get, currently squeeze is the stable version. Then rootfs is the name of the subfolder where debootstrap will work. Finally the URL of the debian mirror we want to use (you can use another one which sits in your country, to make it faster).&lt;br /&gt;
* This process takes a while, it will download all the debian base packages from the mirror and unpack them in the rootfs folder.&lt;br /&gt;
* The next step is to run the second stage of debootstrap. That stage consists in finalizing the installation of the package by running the scripts I mentionned. Since these scripts will be executed using the interpreter who is in the new filesystem, and not by the interpreter from your development PC, we are now facing a problem : The interpreter in that new filesystem is an ARM program, and won&#039;t run on an x86 system. To overcome this, we will make use of qemu, who allows to run foreign architecture Linux programs by doing emulation.&lt;br /&gt;
* First, we need to copy the qemu binary into the new filesystem :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
# cp /usr/bin/qemu-arm-static rootfs/usr/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Then we can launch the second stage of debootstrap, qemu will automatically let it run the ARM binaries through qemu :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
# DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true LC_ALL=C LANGUAGE=C LANG=C chroot rootfs debootstrap/debootstrap --second-stage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* This process also takes a while, it will run the scripts of each package, in order to finalize the packages installation.&lt;br /&gt;
&lt;br /&gt;
==Tweaking the filesystem==&lt;br /&gt;
&lt;br /&gt;
* After the filesystem has been generated by debootstrap, some adjustments need to be done.&lt;br /&gt;
* First, we need to have debian run a getty on the console serial port (ttymxc2 on APF51, ttySMX0 on APF27, ttymxc3 on APF6), otherwise no login prompt will be available on the console port :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
# echo &#039;T0:23:respawn:/sbin/getty -L ttyXXX 115200 vt100&#039; &amp;gt;&amp;gt; rootfs/etc/inittab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The debian mirror also has to be specified in the APT configuration, in order to install new debian packages later :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
# echo &#039;deb http://ftp.debian.org/debian squeeze main&#039; &amp;gt; rootfs/etc/apt/sources.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The hostname of the debian system has to be set properly (here apf51, change it accordingly to your board):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
# echo &#039;apf51&#039; &amp;gt; rootfs/etc/hostname&lt;br /&gt;
# echo &#039;127.0.1.1 apf51&#039; &amp;gt;&amp;gt; rootfs/etc/hosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Remove root password (for first logins):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
# sed -i -e &#039;s/root:\*:/root::/&#039; rootfs/etc/shadow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Finally we can clean the APT cache. We no longer need the deb files, and that will save quite some disk space :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
# chroot rootfs apt-get clean&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Copying the filesystem on the APF==&lt;br /&gt;
* Now that the debian filesystem is ready, it must be transferred to the APF.&lt;br /&gt;
&lt;br /&gt;
* This tutorial will describe a method that will allow to keep the original Armadeus system on the board, and that will permit to choose which system to boot very easily. It is not the only way to run Debian on the APF, but it is quite convinient.&lt;br /&gt;
&lt;br /&gt;
* You need to have an APF51 running the Buildroot based original system.&lt;br /&gt;
&lt;br /&gt;
* The first step is to pack the debian filesystem that has been created on the development PC:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
# tar cvf debian_arm_rootfs.tar rootfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* You will end up with a ~150 MBytes tarball&lt;br /&gt;
* Then this archive should be transfered to the APF51 board. You can use a USB key or a microSD for example. (or TFTP if you have a lot of free space on your APF NAND; then Pput the file in &#039;&#039;/root&#039;&#039; on the APF)&lt;br /&gt;
&lt;br /&gt;
* Now, on the APF, the archive should be extracted (from the media holding it to the APF NAND FLASH). &#039;&#039;&#039;Don&#039;t forget the p option of tar&#039;&#039;&#039;, which is required to properly extract permissions on files :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# cd /root&lt;br /&gt;
# tar xvpf debian_arm_rootfs.tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* We will boot this distribution using chroot. We need to write a script that will be run by the kernel on startup and that will do the chroot at an early stage of the boot process, so that nothing from the original armadeus system is started when we want to boot debian. To do this, create a file called /debinit that contains the following lines :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
mount -t proc none /root/rootfs/proc&lt;br /&gt;
exec chroot /root/rootfs /sbin/init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* This script needs to be executable :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# chmod 755 /debinit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Kernel modules and firmware files need to be copied from the Armadeus system to the debian filesystem :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# cp -r /lib/modules/* /root/rootfs/lib/modules&lt;br /&gt;
# cp -r /lib/firmware /root/rootfs/lib/firmware&lt;br /&gt;
# chroot /root/rootfs /sbin/depmod -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Finally, we need to configure U-Boot so it tells the kernel to use that script on bootup. Reboot your board, press a key to interrupt the automatic boot in U-Boot, then do :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
BIOS&amp;gt; setenv debboot &#039;setenv addubifsargs ${addubifsargs} init=/debinit; run ubifsboot&#039;&lt;br /&gt;
BIOS&amp;gt; saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* That&#039;s all. Now you board will keep booting the original system but if you want to boot debian instead, you can interrupt the autoboot of U-Boot and run the command :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
BIOS&amp;gt; run debboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* In case you want the board to boot debian automatically, you can do so by running :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
BIOS&amp;gt; setenv bootcmd run debboot&lt;br /&gt;
BIOS&amp;gt; saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* You can then switch back to the original Armadeus system by running :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
BIOS&amp;gt; setenv bootcmd run ubifsboot&lt;br /&gt;
BIOS&amp;gt; saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==First login==&lt;br /&gt;
Whaoouh ! It booted ! ;-)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
Debian GNU/Linux 6.0 apfxx ttySMX0/ttymxc2&lt;br /&gt;
&lt;br /&gt;
apfxx login:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Login as root with no password&lt;br /&gt;
&lt;br /&gt;
* Update packages:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
root@apfxx:~# apt-get update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Setup system and RTC date:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
root@apf51:~# date 012011552010&lt;br /&gt;
Wed Jan 20 11:55:00 UTC 2010&lt;br /&gt;
root@apf51:~# hwclock -wu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* If you don&#039;t have any RTC chip on your development board then it could be a good idea to install ntpdate and use it:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
root@apf51:~# apt-get install ntpdate&lt;br /&gt;
...&lt;br /&gt;
root@apf51:~# ntpdate-debian&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Change root password:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
root@apfxx:~# passwd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* If you want an X server (requires ~90MBytes of free space):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
root@apf51:~# aptitude install xserver-xfbdev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Known issues==&lt;br /&gt;
===APF27===&lt;br /&gt;
* Xorg won&#039;t start. (compatibility problem with framebuffer driver)&lt;br /&gt;
&lt;br /&gt;
===APF51===&lt;br /&gt;
* There&#039;s a kernel oops during the boot process. This is related to the SPI driver.&lt;br /&gt;
* Booting takes quite some time because udev has an issue with the SPI port and it takes some time before it timeouts and continues the boot.&lt;br /&gt;
&lt;br /&gt;
===Console Port Issues===&lt;br /&gt;
In some cases the boot crashes and errors like these appear&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
init: Id &amp;quot;T0&amp;quot; respawning too fast: disabled for 5 minutes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It means that the /dev folder haven&#039;t been populated with your console serial port.&lt;br /&gt;
&lt;br /&gt;
To fix this, you need to reboot the apf and run armadeus system, then you need to do the following commands :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# cp -r /dev/ttymxc0 /root/rootfs/dev/ttymxc0 (for apf51)&lt;br /&gt;
# cp -r /dev/ttySMX0 /root/rootfs/dev/ttySMX0 (for apf27)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You also need to check that the file /root/rootfs/etc/securetty contains the console serial port (ttymxc0 for APF51 and ttySMX0 for APF27) if not :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# echo &#039;ttymxc0&#039; &amp;gt;&amp;gt; /root/rootfs/etc/securetty (for apf51)&lt;br /&gt;
# echo &#039;ttySMX0&#039; &amp;gt;&amp;gt; /root/rootfs/etc/securetty (for apf27)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It will allow the root user to login via this serial console.&lt;br /&gt;
&lt;br /&gt;
It could also affects other ports and you will need to do the same procedure for them (ttyX, fbX, input, ttymxcX, ttySMXX, etc.)&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://www.debian.org/releases/stable/i386/apds03.html.en Installing Debian GNU/Linux from a Unix/Linux System]&lt;br /&gt;
* http://free-electrons.com/blog/embdebian-with-multistrap/&lt;br /&gt;
* http://wiki.debian.org/Xfce&lt;br /&gt;
* [http://fr.scribd.com/doc/123130564/Installation-de-Debian-sur-la-carte-Armadeus-APF28 Enhanced french tutorial to install Debian on an APF board]&lt;br /&gt;
&lt;br /&gt;
[[Category:Distribution]]&lt;/div&gt;</summary>
		<author><name>SebastienR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Members&amp;diff=12655</id>
		<title>Members</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Members&amp;diff=12655"/>
		<updated>2014-06-17T11:38:35Z</updated>

		<summary type="html">&lt;p&gt;SebastienR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Google Map==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;googlemap lat=&amp;quot;47&amp;quot; lon=&amp;quot;6&amp;quot; width=640 height=480 zoom=4&amp;gt;&lt;br /&gt;
47.270377, 6.025314, [[User:JulienB]] Besancon&lt;br /&gt;
47.752598,7.301788, ARMadeus Systems&lt;br /&gt;
47.760791, 7.339897, [[User:Salocin68]] Mulhouse&lt;br /&gt;
47.734392,7.316975, [[User:FabienM]] Mulhouse&lt;br /&gt;
46.946161,7.517052, [[User:Jorasse]] Gümligen&lt;br /&gt;
47.681108, 7.390366, [[User:Carbure]] Helfranzkirch&lt;br /&gt;
47.436448, 8.429947, [[User:SonZerro]] Baden&lt;br /&gt;
44.653992, 6.176672, [[User:JulienN]] Chabottes&lt;br /&gt;
48.573342, 7.911476,  [[User:KroMignon]] Legelshurst&lt;br /&gt;
42.734405, 2.894211, ELIAUS Perpignan&lt;br /&gt;
47.653363, 6.862335, UTBM Belfort&lt;br /&gt;
45.689589, 5.026395, [[User:OlivierT]] St Bonnet de Mure&lt;br /&gt;
48.879619, 2.351074, Paris - 21 members&lt;br /&gt;
43.622159, 1.442642, Toulouse - 2 members&lt;br /&gt;
-21.115141, 55.536384, La Réunion - 1 member&lt;br /&gt;
14.551684, -60.912323, La Martinique - 1 member&lt;br /&gt;
48.682805, 2.169186, [[User:BrunoL]] Les Ulis&lt;br /&gt;
47.399744, 8.53775, Zurich - 1 member&lt;br /&gt;
46.810282, 7.151241, Fribourg&lt;br /&gt;
47.574904, 7.580566, Basel&lt;br /&gt;
48.839250, 2.392584, [[User:jmn12]] Paris  &lt;br /&gt;
60.187238, 24.819231, [[User:EemeliA]] Espoo&lt;br /&gt;
53.371859, -6.2677, Dublin - 1 member&lt;br /&gt;
50.637704, 5.608521, Liège - 1 member&lt;br /&gt;
50.67, 3.48, Velaines - 1 member&lt;br /&gt;
48.199964, 11.57959, Munich - 1 member&lt;br /&gt;
48.109588, -1.678752, Rennes - 1 member&lt;br /&gt;
47.750109, -3.366339, [[User:MatthieuT]] Lorient&lt;br /&gt;
48.70,2.03, [[User:JulienPeeters]] Chevreuse&lt;br /&gt;
45.190325, 5.700316, [[User:NicolasL]] Fontaine&lt;br /&gt;
49.279296, 2.472973 [[User:DavidC]] Nogent sur Oise&lt;br /&gt;
46.208644, 6.130027, [[User:EugeneR]] Genève&lt;br /&gt;
48.667158, 2.706585, [[User:BernardR]] Soignolles en Brie, France&lt;br /&gt;
45.188963, 5.709822, [[User:OlivierS]], [[User:HugoP|Hugo Petit]] - Grenoble, France&lt;br /&gt;
47.214613, -0.737329, [[User:BrunoS]] Chemillé, France&lt;br /&gt;
47.225164, -1.556625, [[User:KevinP]] Nantes, France&lt;br /&gt;
43.609234, 1.442642, [[User:PierreBa]] Toulouse, France&lt;br /&gt;
41.668809, -0.87616, [[User:AntonioMB]] Zaragoza, España&lt;br /&gt;
49.200145, 0.407136, [[User:JeanFrancoisR]] - Asnières&lt;br /&gt;
48.109588, -1.678752, [[User:MichelTe]] - Rennes&lt;br /&gt;
49.163073, 2.550201, [[User:JulienBa]] - Pontarmé&lt;br /&gt;
43.488299, 5.494709, [[User:FrankA]] - Meyreuil&lt;br /&gt;
43.622159, 1.442642, [[User:PierreAlexandreS]] - Toulouse, France&lt;br /&gt;
51.46513, -0.9692, [[User:AlexG]] - Reading, UK&lt;br /&gt;
43.312439, 10.517693, [[User:PaoloB]] - Cecina, Italy&lt;br /&gt;
52.63, 4.75, Alkmaar - 1 member&lt;br /&gt;
50.776093, 14.632759, [[User:PetrD]] - Cvikov, ČR&lt;br /&gt;
48.42097, -4.471693, [[User:OlivierR]] - Brest, France&lt;br /&gt;
48.575244, -4.563446, [[User:JeanChristopheL]] - Brest, France&lt;br /&gt;
49.417767, 2.826945, [[User:PhilippeL]] - Compiègne, France&lt;br /&gt;
48.806044, 2.347512, [[User:PierreDe]] - Arcueil, France&lt;br /&gt;
50.803050, 4.358533, [[User:SebastienVC]] - Bruxelles, Belgique&lt;br /&gt;
45.535213, -73.668823, [[User:PhilBB]] - Montreal, Canada&lt;br /&gt;
48.830759, 2.359204, [[User:Théo179]] - Arcueil, France&lt;br /&gt;
48.694563, 2.184605, [[User:IdrissB|Idriss]] - Courbevoie, France&lt;br /&gt;
41.563161, 2.020814, [[User:JaumeF|Jaume Figueras]] - Terrassa, Catalunya, Spain&lt;br /&gt;
35.415303,139.595332, [[User:HiroshiM]] - Yokohama, Japan&lt;br /&gt;
45.203191,5.716288, [[User:GaelV|Gaël Vanderbruggen]] - St Martin le Vinoux, France&lt;br /&gt;
48.700223, 2.22766, [[User:JeanMarcM| pieddemamouth/ Jean-Marc Montanier]] - Villebon-sur-Yvette, France&lt;br /&gt;
48.419351, -4.469765, [[User:MohamedS]] - Brest, FRANCE&lt;br /&gt;
47.319276, 0.285645, [[User:StephaneD]] - Joué les Tours, FRANCE&lt;br /&gt;
49.183274,-0.37096,[[User:ArnaudB]] - Caen, France&lt;br /&gt;
40.416691,-3.700345, [[User:AntonioD]] - Madrid, Spain&lt;br /&gt;
49.674442,-1.736793, [[User:FrancoisL]] - Urville-Nacqueville, France&lt;br /&gt;
-1.45502,-48.502368, [[User:MarcusF]] - Belém-PA, Brazil&lt;br /&gt;
47.219335,-1.555939, [[User:PhilippeLe]] - Nantes, France&lt;br /&gt;
49.652024,3.28098, [[User:JeremieG|Jeremie Girouard]] - Vouel&lt;br /&gt;
49.119666,6.176905, [[User:PierreB]] - Metz, France&lt;br /&gt;
38.895308,-77.036133, [[User:KennethM]] - Washington DC, United States&lt;br /&gt;
45.35510,6.30504, [[User:VincentC]] - Saint-Avre, France&lt;br /&gt;
47.0667,6.75,[[User:FlorianM]] - Le Locle, Suisse&lt;br /&gt;
50.063606,19.943039,[[User:VascoB]] - Kraków, Poland&lt;br /&gt;
39.656225,-8.575344,[[User:VascoB]] - Ourém, Portugal&lt;br /&gt;
47.49772,19.039993,[[User:JanosA]] - Budapest, Hungary&lt;br /&gt;
43.592576,7.194328,[[User:JiyanA]] - Antibes, France&lt;br /&gt;
47.6456311,6.8411555,[[User:SebastienR]] - Belfort, France&lt;br /&gt;
&amp;lt;/googlemap&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===How to add your position===&lt;br /&gt;
* go to http://maps.google.com/&lt;br /&gt;
* type in the name of your town and launch &amp;quot;Search Google Maps&amp;quot;, for example:&lt;br /&gt;
[[Image:Google_maps_search.png]]&lt;br /&gt;
* right click on &amp;quot;Get URL of this page&amp;quot; and copy the URL&lt;br /&gt;
[[Image:Google_maps_url.png]]&lt;br /&gt;
* you should get something like that:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://maps.google.com/maps?f=q&amp;amp;hl=fr&amp;amp;geocode=&amp;amp;q=besan%C3%A7on&amp;amp;ie=UTF8&amp;amp;ll=47.257796,6.025314&amp;amp;spn=0.216236,0.601501&amp;amp;z=11&amp;amp;iwloc=addr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* the data between &#039;&#039;&amp;amp;ll=&#039;&#039; and &#039;&#039;&amp;amp;spn&#039;&#039; are the needed one (latitude/longitude)&lt;br /&gt;
* extract them and copy them in the &amp;quot;Edit&amp;quot; of this wiki page. Add it you wiki name and your town. For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;googlemap lat=&amp;quot;47&amp;quot; lon=&amp;quot;6&amp;quot; width=640 height=480 zoom=4&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
Others coordinates&lt;br /&gt;
...&lt;br /&gt;
47.257796, 6.025314, [[User:YourID|YourName]] - Your Town&lt;br /&gt;
&amp;lt;/googlemap&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Association]]&lt;/div&gt;</summary>
		<author><name>SebastienR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=AsDevices&amp;diff=11720</id>
		<title>AsDevices</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=AsDevices&amp;diff=11720"/>
		<updated>2013-03-13T14:06:50Z</updated>

		<summary type="html">&lt;p&gt;SebastienR: /* Development planning */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
AsDevices is an ARMadeus specific library that simplify APF-board devices usage for developers. This library is written to be used with C, C++, Python, (Java?) languages.&lt;br /&gt;
The core is written in C and other languages support is done with &amp;quot;wrappers&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{Note| This library is under development, see the [[AsDevices#Development_planning | Development planning.]] to know which functionality is finished.}}&lt;br /&gt;
&lt;br /&gt;
== Install AsDevices on target ==&lt;br /&gt;
&lt;br /&gt;
The library is included in Buildroot menu, to use it just select it:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
  *** Armadeus specific packages ***&lt;br /&gt;
  Armadeus specific tools/utilities  ---&amp;gt;   &lt;br /&gt;
    [*] as_devices &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The base library is in C, to use it with C++ or Python, select the wrapper you need. (For Python you will need to select Python interpreter before as_devices wrapper).&lt;br /&gt;
&lt;br /&gt;
== Generate doxygen documentation ==&lt;br /&gt;
* If &#039;&#039;&#039;doxygen&#039;&#039;&#039; isn&#039;t installed on your Linux distribution, you have to install the correct package:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo apt-get install doxygen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Then go in &#039;&#039;&#039;As Devices&#039;&#039;&#039; root directory.&lt;br /&gt;
* Generate the documentation with Doxygen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ doxygen Doxyfile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Documentation has been generated in &#039;&#039;documentation&#039;&#039;.&lt;br /&gt;
** Open documentation with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ firefox documentation/index.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using library in C ==&lt;br /&gt;
&lt;br /&gt;
All functions in AsDevices library are constructed on the same way. An as_*_open() function return a device structure or an int that represent the device used. All function take this device structure in first parameter, and a function as_*_close() close the device :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
struct as_devicename_dev * as_devicename_open(&amp;lt;some parameters&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
as_devicename_do-something-with-device(struct as_devicename_dev *aDev, &amp;lt;some parameters&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
int as_devicename_close(struct as_devicename_dev *aDev);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each library, full documentation can be found in C header in directory &#039;&#039;target/packages/as_devices/c&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== I²C ===&lt;br /&gt;
&lt;br /&gt;
as_i2c_* functions are used to access devices on i²c bus that doesn&#039;t have/need a Linux driver. If you want to access an i²c device, please find out if a driver is not already existing before using this method.&lt;br /&gt;
&lt;br /&gt;
To open the bus, you have to know its number. On [[APF9328]] and [[APF27]] only two busses are present: number 0 and number 1. The &#039;&#039;open()&#039;&#039; function returns an int (file descriptor of the opened &#039;&#039;/dec/i2c-x&#039;&#039;), that have to be passed to all other as_i2c_* functions :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int as_i2c_open(unsigned int i2c_id);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then depending on the complexity of the I2C device communication protocol, you can either use read()/write() (simple frames) or ioctl() with complex &amp;quot;read then write&amp;quot;/&amp;quot;write then read&amp;quot; messages.&lt;br /&gt;
&lt;br /&gt;
* Example (simple write()):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;as_devices/as_i2c.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int my_device = 0;&lt;br /&gt;
#define MY_DEV_ADDR 0x23&lt;br /&gt;
#define MY_I2C_BUS 1&lt;br /&gt;
unsigned char buf[10];&lt;br /&gt;
int ret;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
my_device = as_i2c_open(MY_I2C_BUS);&lt;br /&gt;
if (my_device &amp;lt; 0) {&lt;br /&gt;
    printf(&amp;quot;Can&#039;t init I2C port %d!!\n&amp;quot;, MY_I2C_BUS);&lt;br /&gt;
    return -1;&lt;br /&gt;
}&lt;br /&gt;
as_i2c_set_slave(my_device, MY_DEV_ADDR);&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
buf[0] = (unsigned char) my_val;&lt;br /&gt;
ret = write(my_device, buf, 1);&lt;br /&gt;
if (ret &amp;lt; 0)&lt;br /&gt;
    printf(&amp;quot;Error while sending data to device !!\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
&lt;br /&gt;
==== Usage ====&lt;br /&gt;
To use as_spi_* function, the &#039;&#039;spidev&#039;&#039; kernel module/interface is required. See [[SPI]]&lt;br /&gt;
page to know how to configure it.&lt;br /&gt;
&lt;br /&gt;
Once the device file &#039;&#039;/dev/spidevx.x&#039;&#039; is available from the kernel, as_spi library can be used by including the &#039;&#039;as_spi.h&#039;&#039; header in your C source code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;as_devices/as_spi.h&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Full description of the API can be found in this header (target/packages/as_devices/c/as_spi.h), available on&lt;br /&gt;
[http://sourceforge.net/p/armadeus/code sourceforge repository].&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
The three mains useful functions used to communicate with a slave SPI device&lt;br /&gt;
are :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int as_spi_open(const unsigned char *aSpidev_name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To open the &#039;&#039;/dev/spidevx.x&#039;&#039; special spi file. This function return a file&lt;br /&gt;
handler that will be used for all othes as_spi_* function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void as_spi_close(int aFd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As its name said, to close the device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
uint32_t as_spi_msg(int aFd, &lt;br /&gt;
                    uint32_t aMsg, &lt;br /&gt;
                    size_t aLen,&lt;br /&gt;
                    uint32_t aSpeed);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function forge spi messages on MOSI pin and return MISO message.&lt;br /&gt;
&lt;br /&gt;
=== GPIO ===&lt;br /&gt;
&lt;br /&gt;
==== Usage ====&lt;br /&gt;
&lt;br /&gt;
To use as_gpio_* functions, the &#039;&#039;gpio&#039;&#039; kernel module is required. See [[GPIO_Driver]] page to know how to configure it.&lt;br /&gt;
&lt;br /&gt;
Once the device files &#039;&#039;/dev/gpio/*&#039;&#039; are available , as_gpio library can be use by including &#039;&#039;as_gpio.h&#039;&#039; header in the C source code of your application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;as_devices/as_gpio.h&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
Two examples are given, one for lightening led D14 and one to use blocking read on switch S1. This two example are made for [[APF27Dev]] daughter card.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Lightening led&#039;&#039;&#039;&lt;br /&gt;
With as_gpio, each pin port can be openned separately. The as_gpio_open() function returns a pointer on gpio pin structure declared like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 int ret; /* for returning value */&lt;br /&gt;
 struct as_gpio_device *pf14;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On APF27Dev, D14 is plugged on port F pin 14, then to open it :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 pf14 = as_gpio_open(&#039;F&#039;, 14);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GPIO must be configured in ouput mode :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 ret = as_gpio_set_pin_direction(pf14, &amp;quot;out&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then to switch LED value, just use &#039;&#039;as_gpio_set_pin_value()&#039;&#039; function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 ret = as_gpio_set_pin_value(pf14, 1); /* led off */&lt;br /&gt;
 ...&lt;br /&gt;
 ret = as_gpio_set_pin_value(pf14, 0); /* led on */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that because off led wiring, led polarity is inverted (to light on set 0).&lt;br /&gt;
&lt;br /&gt;
Once gpio pin usage is terminated, it must be closed :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 as_gpio_close(pf14);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Pressing button&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The button S1 can be used to test interrupt capability of gpio. The button is plugged on gpio port F pin 13.&lt;br /&gt;
After declaring the &#039;&#039;as_gpio_device&#039;&#039; structure, the pin port can be opened :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 struct as_gpio_device *pf13;&lt;br /&gt;
 [...]&lt;br /&gt;
&lt;br /&gt;
 pf13 = as_gpio_open(&#039;F&#039;, 13);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To stuff must be configured before using it as interruption source, direction and IRQ mode.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;direction&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 ret = as_gpio_set_pin_direction(pf13, &amp;quot;in&amp;quot;); /* set switch as input */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;IRQ mode&#039;&#039;&#039;&lt;br /&gt;
There is four IRQ mode :&lt;br /&gt;
* &#039;&#039;&#039;GPIO_IRQ_MODE_NOINT  &#039;&#039;&#039;: No interrupt, the processor will ignore event on this gpio.&lt;br /&gt;
* &#039;&#039;&#039;GPIO_IRQ_MODE_RISING &#039;&#039;&#039;: rising edge, the processor will generate an interruption on rising edge of gpio pin.&lt;br /&gt;
* &#039;&#039;&#039;GPIO_IRQ_MODE_FALLING&#039;&#039;&#039;: falling edge, the processor will generate an interruption on falling edge of gpio pin.&lt;br /&gt;
* &#039;&#039;&#039;GPIO_IRQ_MODE_BOTH   &#039;&#039;&#039;: both, the processor will generate an interruption on both rising or falling edge of gpio.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 ret = as_gpio_set_irq_mode(pf13, GPIO_IRQ_MODE_FALLING); /* interrupt will be generated on pushed button */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To capture interruption, the blocking read function can be used with a timeout. If no interruption is raised after the timeout time, read function end with error value -10.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 ret = as_gpio_blocking_get_pin_value(pf13, 3, 0); /* wait for interruption for 3 seconds and 0 µs) */&lt;br /&gt;
 if(ret == -10)&lt;br /&gt;
     printf(&amp;quot;Timeout\n&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ADC ===&lt;br /&gt;
==== MAX1027 ====&lt;br /&gt;
==== AS1531 ====&lt;br /&gt;
=== DAC ===&lt;br /&gt;
==== MAX5821 ====&lt;br /&gt;
==== MCP4912 ====&lt;br /&gt;
=== 93LCXX ===&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== Usage ====&lt;br /&gt;
&lt;br /&gt;
To use as_pwm_* functions, the kernel module &#039;&#039;imx_pwm&#039;&#039; needs to be loaded. See [[PWM]] page to know how to configure it.&lt;br /&gt;
&lt;br /&gt;
Once the special files &#039;&#039;/sys/class/pwm/pwmX/*&#039;&#039; are available , as_pwm_* functions can be use by including &#039;&#039;as_pwm.h&#039;&#039; header in the C source code of your application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;as_devices/as_pwm.h&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;as_devices/as_pwm.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
    struct as_pwm_device *my_pwm;&lt;br /&gt;
...&lt;br /&gt;
    my_pwm = as_pwm_open(0);&lt;br /&gt;
    if (!my_pwm)&lt;br /&gt;
        printf(&amp;quot;Can&#039;t init PWM !!\n&amp;quot;);&lt;br /&gt;
    as_pwm_set_frequency(my_pwm, 150);&lt;br /&gt;
    as_pwm_set_duty(my_pwm, 500);&lt;br /&gt;
...&lt;br /&gt;
    as_pwm_set_state(my_pwm, 1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LED ===&lt;br /&gt;
&lt;br /&gt;
== Using library in Python ==&lt;br /&gt;
&lt;br /&gt;
To use AsDevices in Python, select the python wrapper in menuconfig as follow :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
  *** Armadeus specific packages ***&lt;br /&gt;
  Armadeus specific tools/utilities  ---&amp;gt;   &lt;br /&gt;
    [*] as_devices &lt;br /&gt;
    [*]   wrapper Python&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And keep all .py file on target :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
    Interpreter languages and scripting  ---&amp;gt;&lt;br /&gt;
        python module format to install (.py sources and .pyc compiled)  ---&amp;gt;&lt;br /&gt;
            (X) .py sources and .pyc compiled&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
then compile bsp and flash it on your board.&lt;br /&gt;
&lt;br /&gt;
Once done, just import the module AsDevices to use all function available in library:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import AsDevices&lt;br /&gt;
from AsDevices import AsGpio&lt;br /&gt;
&lt;br /&gt;
gpio = AsGpio(3)&lt;br /&gt;
gpio.setPinDirection(&#039;out&#039;)&lt;br /&gt;
gpio.setPinValue(1)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using library in C++ ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Development planning ==&lt;br /&gt;
&lt;br /&gt;
AsDevices is not finished, following table indicates the remaining work:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; summary=&amp;quot;Development planning of AsDevices&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#efefef;&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Name !! Component !! C functions !! C++ wrapper !! Python wrapper !! Python class !! description &lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| [[I2C | i2c]] ||  || bgcolor=&amp;quot;green&amp;quot;| Ok || bgcolor=&amp;quot;green&amp;quot;| Ok ||bgcolor=#FF0000| NOK ||bgcolor=#FF0000| NOK ||  Drive I2C&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| [[SPI | spi]] || || bgcolor=&amp;quot;green&amp;quot; | Ok, but not fully tested || bgcolor=&amp;quot;green&amp;quot;| Ok, but not fully tested  ||bgcolor=&amp;quot;green&amp;quot;| Ok, but not fully tested  || bgcolor=&amp;quot;green&amp;quot;| Ok, but not fully tested  || Drive SPI&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| [[Gpio | gpio]] || || bgcolor=&amp;quot;green&amp;quot;| Ok || bgcolor=&amp;quot;green&amp;quot;| Ok ||bgcolor=&amp;quot;green&amp;quot; | Ok ||bgcolor=&amp;quot;green&amp;quot; | Ok || Drive GPIO&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | ADC&lt;br /&gt;
| [[ADC_max1027 | max1027]] || bgcolor=&amp;quot;green&amp;quot;| Ok for SLOW mode ||bgcolor=&amp;quot;green&amp;quot;| Ok ||bgcolor=#FF0000| NOK ||bgcolor=#FF0000| NOK || &lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| [[as1531 | as1531]] || bgcolor=&amp;quot;green&amp;quot;| Ok for SLOW mode ||bgcolor=&amp;quot;green&amp;quot;| Ok ||bgcolor=#FF0000| NOK ||bgcolor=#FF0000| NOK || &lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| [[lradc | lradc]] || bgcolor=&amp;quot;green&amp;quot;| Ok for SLOW mode ||bgcolor=&amp;quot;green&amp;quot;| Ok ||bgcolor=#FF0000| NOK ||bgcolor=#FF0000| NOK || &lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | DAC&lt;br /&gt;
| [[Max5821 | max5821]] || bgcolor=&amp;quot;green&amp;quot;| OK ||bgcolor=&amp;quot;green&amp;quot;| Ok, but not fully tested ||bgcolor=#FF0000| NOK ||bgcolor=#FF0000| NOK || &lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| [[Mcp4912 | mcp4912]] || bgcolor=&amp;quot;red&amp;quot;| NOK ||bgcolor=&amp;quot;green&amp;quot;| Ok ||bgcolor=#FF0000| NOK ||bgcolor=#FF0000| NOK || &lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| eeprom || 93LCxx ||bgcolor=&amp;quot;green&amp;quot;| OK ||bgcolor=&amp;quot;green&amp;quot;| OK ||bgcolor=#FF0000| NOK ||bgcolor=#FF0000| NOK || &lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| [[PWM]] || ||bgcolor=&amp;quot;green&amp;quot; |  OK  ||  bgcolor=&amp;quot;green&amp;quot; | OK    || bgcolor=&amp;quot;red&amp;quot; | NOK  || bgcolor=&amp;quot;red&amp;quot; | NOK || Drive imx27 pwm |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| [[Backlight]] || ||bgcolor=&amp;quot;green&amp;quot; |  OK  ||  bgcolor=&amp;quot;green&amp;quot; | OK    || bgcolor=&amp;quot;red&amp;quot; | NOK  || bgcolor=&amp;quot;red&amp;quot; | NOK ||&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| [[Led | led]] || || bgcolor=&amp;quot;green&amp;quot;| Ok || bgcolor=#FF0000 | NOk ||bgcolor=#FF0000 | NOk ||bgcolor=#FF0000 | NOk || Drive LED&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>SebastienR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=AsDevices&amp;diff=11719</id>
		<title>AsDevices</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=AsDevices&amp;diff=11719"/>
		<updated>2013-03-13T08:05:00Z</updated>

		<summary type="html">&lt;p&gt;SebastienR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
AsDevices is an ARMadeus specific library that simplify APF-board devices usage for developers. This library is written to be used with C, C++, Python, (Java?) languages.&lt;br /&gt;
The core is written in C and other languages support is done with &amp;quot;wrappers&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{Note| This library is under development, see the [[AsDevices#Development_planning | Development planning.]] to know which functionality is finished.}}&lt;br /&gt;
&lt;br /&gt;
== Install AsDevices on target ==&lt;br /&gt;
&lt;br /&gt;
The library is included in Buildroot menu, to use it just select it:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
  *** Armadeus specific packages ***&lt;br /&gt;
  Armadeus specific tools/utilities  ---&amp;gt;   &lt;br /&gt;
    [*] as_devices &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The base library is in C, to use it with C++ or Python, select the wrapper you need. (For Python you will need to select Python interpreter before as_devices wrapper).&lt;br /&gt;
&lt;br /&gt;
== Generate doxygen documentation ==&lt;br /&gt;
* If &#039;&#039;&#039;doxygen&#039;&#039;&#039; isn&#039;t installed on your Linux distribution, you have to install the correct package:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo apt-get install doxygen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Then go in &#039;&#039;&#039;As Devices&#039;&#039;&#039; root directory.&lt;br /&gt;
* Generate the documentation with Doxygen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ doxygen Doxyfile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Documentation has been generated in &#039;&#039;documentation&#039;&#039;.&lt;br /&gt;
** Open documentation with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ firefox documentation/index.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using library in C ==&lt;br /&gt;
&lt;br /&gt;
All functions in AsDevices library are constructed on the same way. An as_*_open() function return a device structure or an int that represent the device used. All function take this device structure in first parameter, and a function as_*_close() close the device :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
struct as_devicename_dev * as_devicename_open(&amp;lt;some parameters&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
as_devicename_do-something-with-device(struct as_devicename_dev *aDev, &amp;lt;some parameters&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
int as_devicename_close(struct as_devicename_dev *aDev);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each library, full documentation can be found in C header in directory &#039;&#039;target/packages/as_devices/c&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== I²C ===&lt;br /&gt;
&lt;br /&gt;
as_i2c_* functions are used to access devices on i²c bus that doesn&#039;t have/need a Linux driver. If you want to access an i²c device, please find out if a driver is not already existing before using this method.&lt;br /&gt;
&lt;br /&gt;
To open the bus, you have to know its number. On [[APF9328]] and [[APF27]] only two busses are present: number 0 and number 1. The &#039;&#039;open()&#039;&#039; function returns an int (file descriptor of the opened &#039;&#039;/dec/i2c-x&#039;&#039;), that have to be passed to all other as_i2c_* functions :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int as_i2c_open(unsigned int i2c_id);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then depending on the complexity of the I2C device communication protocol, you can either use read()/write() (simple frames) or ioctl() with complex &amp;quot;read then write&amp;quot;/&amp;quot;write then read&amp;quot; messages.&lt;br /&gt;
&lt;br /&gt;
* Example (simple write()):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;as_devices/as_i2c.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int my_device = 0;&lt;br /&gt;
#define MY_DEV_ADDR 0x23&lt;br /&gt;
#define MY_I2C_BUS 1&lt;br /&gt;
unsigned char buf[10];&lt;br /&gt;
int ret;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
my_device = as_i2c_open(MY_I2C_BUS);&lt;br /&gt;
if (my_device &amp;lt; 0) {&lt;br /&gt;
    printf(&amp;quot;Can&#039;t init I2C port %d!!\n&amp;quot;, MY_I2C_BUS);&lt;br /&gt;
    return -1;&lt;br /&gt;
}&lt;br /&gt;
as_i2c_set_slave(my_device, MY_DEV_ADDR);&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
buf[0] = (unsigned char) my_val;&lt;br /&gt;
ret = write(my_device, buf, 1);&lt;br /&gt;
if (ret &amp;lt; 0)&lt;br /&gt;
    printf(&amp;quot;Error while sending data to device !!\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
&lt;br /&gt;
==== Usage ====&lt;br /&gt;
To use as_spi_* function, the &#039;&#039;spidev&#039;&#039; kernel module/interface is required. See [[SPI]]&lt;br /&gt;
page to know how to configure it.&lt;br /&gt;
&lt;br /&gt;
Once the device file &#039;&#039;/dev/spidevx.x&#039;&#039; is available from the kernel, as_spi library can be used by including the &#039;&#039;as_spi.h&#039;&#039; header in your C source code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;as_devices/as_spi.h&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Full description of the API can be found in this header (target/packages/as_devices/c/as_spi.h), available on&lt;br /&gt;
[http://sourceforge.net/p/armadeus/code sourceforge repository].&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
The three mains useful functions used to communicate with a slave SPI device&lt;br /&gt;
are :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int as_spi_open(const unsigned char *aSpidev_name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To open the &#039;&#039;/dev/spidevx.x&#039;&#039; special spi file. This function return a file&lt;br /&gt;
handler that will be used for all othes as_spi_* function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void as_spi_close(int aFd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As its name said, to close the device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
uint32_t as_spi_msg(int aFd, &lt;br /&gt;
                    uint32_t aMsg, &lt;br /&gt;
                    size_t aLen,&lt;br /&gt;
                    uint32_t aSpeed);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function forge spi messages on MOSI pin and return MISO message.&lt;br /&gt;
&lt;br /&gt;
=== GPIO ===&lt;br /&gt;
&lt;br /&gt;
==== Usage ====&lt;br /&gt;
&lt;br /&gt;
To use as_gpio_* functions, the &#039;&#039;gpio&#039;&#039; kernel module is required. See [[GPIO_Driver]] page to know how to configure it.&lt;br /&gt;
&lt;br /&gt;
Once the device files &#039;&#039;/dev/gpio/*&#039;&#039; are available , as_gpio library can be use by including &#039;&#039;as_gpio.h&#039;&#039; header in the C source code of your application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;as_devices/as_gpio.h&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
Two examples are given, one for lightening led D14 and one to use blocking read on switch S1. This two example are made for [[APF27Dev]] daughter card.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Lightening led&#039;&#039;&#039;&lt;br /&gt;
With as_gpio, each pin port can be openned separately. The as_gpio_open() function returns a pointer on gpio pin structure declared like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 int ret; /* for returning value */&lt;br /&gt;
 struct as_gpio_device *pf14;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On APF27Dev, D14 is plugged on port F pin 14, then to open it :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 pf14 = as_gpio_open(&#039;F&#039;, 14);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GPIO must be configured in ouput mode :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 ret = as_gpio_set_pin_direction(pf14, &amp;quot;out&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then to switch LED value, just use &#039;&#039;as_gpio_set_pin_value()&#039;&#039; function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 ret = as_gpio_set_pin_value(pf14, 1); /* led off */&lt;br /&gt;
 ...&lt;br /&gt;
 ret = as_gpio_set_pin_value(pf14, 0); /* led on */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that because off led wiring, led polarity is inverted (to light on set 0).&lt;br /&gt;
&lt;br /&gt;
Once gpio pin usage is terminated, it must be closed :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 as_gpio_close(pf14);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Pressing button&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The button S1 can be used to test interrupt capability of gpio. The button is plugged on gpio port F pin 13.&lt;br /&gt;
After declaring the &#039;&#039;as_gpio_device&#039;&#039; structure, the pin port can be opened :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 struct as_gpio_device *pf13;&lt;br /&gt;
 [...]&lt;br /&gt;
&lt;br /&gt;
 pf13 = as_gpio_open(&#039;F&#039;, 13);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To stuff must be configured before using it as interruption source, direction and IRQ mode.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;direction&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 ret = as_gpio_set_pin_direction(pf13, &amp;quot;in&amp;quot;); /* set switch as input */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;IRQ mode&#039;&#039;&#039;&lt;br /&gt;
There is four IRQ mode :&lt;br /&gt;
* &#039;&#039;&#039;GPIO_IRQ_MODE_NOINT  &#039;&#039;&#039;: No interrupt, the processor will ignore event on this gpio.&lt;br /&gt;
* &#039;&#039;&#039;GPIO_IRQ_MODE_RISING &#039;&#039;&#039;: rising edge, the processor will generate an interruption on rising edge of gpio pin.&lt;br /&gt;
* &#039;&#039;&#039;GPIO_IRQ_MODE_FALLING&#039;&#039;&#039;: falling edge, the processor will generate an interruption on falling edge of gpio pin.&lt;br /&gt;
* &#039;&#039;&#039;GPIO_IRQ_MODE_BOTH   &#039;&#039;&#039;: both, the processor will generate an interruption on both rising or falling edge of gpio.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 ret = as_gpio_set_irq_mode(pf13, GPIO_IRQ_MODE_FALLING); /* interrupt will be generated on pushed button */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To capture interruption, the blocking read function can be used with a timeout. If no interruption is raised after the timeout time, read function end with error value -10.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 ret = as_gpio_blocking_get_pin_value(pf13, 3, 0); /* wait for interruption for 3 seconds and 0 µs) */&lt;br /&gt;
 if(ret == -10)&lt;br /&gt;
     printf(&amp;quot;Timeout\n&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ADC ===&lt;br /&gt;
==== MAX1027 ====&lt;br /&gt;
==== AS1531 ====&lt;br /&gt;
=== DAC ===&lt;br /&gt;
==== MAX5821 ====&lt;br /&gt;
==== MCP4912 ====&lt;br /&gt;
=== 93LCXX ===&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== Usage ====&lt;br /&gt;
&lt;br /&gt;
To use as_pwm_* functions, the kernel module &#039;&#039;imx_pwm&#039;&#039; needs to be loaded. See [[PWM]] page to know how to configure it.&lt;br /&gt;
&lt;br /&gt;
Once the special files &#039;&#039;/sys/class/pwm/pwmX/*&#039;&#039; are available , as_pwm_* functions can be use by including &#039;&#039;as_pwm.h&#039;&#039; header in the C source code of your application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;as_devices/as_pwm.h&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;as_devices/as_pwm.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
    struct as_pwm_device *my_pwm;&lt;br /&gt;
...&lt;br /&gt;
    my_pwm = as_pwm_open(0);&lt;br /&gt;
    if (!my_pwm)&lt;br /&gt;
        printf(&amp;quot;Can&#039;t init PWM !!\n&amp;quot;);&lt;br /&gt;
    as_pwm_set_frequency(my_pwm, 150);&lt;br /&gt;
    as_pwm_set_duty(my_pwm, 500);&lt;br /&gt;
...&lt;br /&gt;
    as_pwm_set_state(my_pwm, 1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LED ===&lt;br /&gt;
&lt;br /&gt;
== Using library in Python ==&lt;br /&gt;
&lt;br /&gt;
To use AsDevices in Python, select the python wrapper in menuconfig as follow :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
  *** Armadeus specific packages ***&lt;br /&gt;
  Armadeus specific tools/utilities  ---&amp;gt;   &lt;br /&gt;
    [*] as_devices &lt;br /&gt;
    [*]   wrapper Python&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And keep all .py file on target :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
    Interpreter languages and scripting  ---&amp;gt;&lt;br /&gt;
        python module format to install (.py sources and .pyc compiled)  ---&amp;gt;&lt;br /&gt;
            (X) .py sources and .pyc compiled&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
then compile bsp and flash it on your board.&lt;br /&gt;
&lt;br /&gt;
Once done, just import the module AsDevices to use all function available in library:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import AsDevices&lt;br /&gt;
from AsDevices import AsGpio&lt;br /&gt;
&lt;br /&gt;
gpio = AsGpio(3)&lt;br /&gt;
gpio.setPinDirection(&#039;out&#039;)&lt;br /&gt;
gpio.setPinValue(1)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using library in C++ ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Development planning ==&lt;br /&gt;
&lt;br /&gt;
AsDevices is not finished, following table indicates the remaining work:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; summary=&amp;quot;Development planning of AsDevices&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#efefef;&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Name !! Component !! C functions !! C++ wrapper !! Python wrapper !! Python class !! description &lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| [[I2C | i2c]] ||  || bgcolor=&amp;quot;green&amp;quot;| Ok || bgcolor=&amp;quot;green&amp;quot;| Ok ||bgcolor=#FF0000| NOK ||bgcolor=#FF0000| NOK ||  Drive I2C&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| [[SPI | spi]] || || bgcolor=&amp;quot;green&amp;quot; | Ok, but not fully tested || bgcolor=&amp;quot;green&amp;quot;| Ok, but not fully tested  ||bgcolor=&amp;quot;green&amp;quot;| Ok, but not fully tested  || bgcolor=&amp;quot;green&amp;quot;| Ok, but not fully tested  || Drive SPI&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| [[Gpio | gpio]] || || bgcolor=&amp;quot;green&amp;quot;| Ok || bgcolor=&amp;quot;green&amp;quot;| Ok ||bgcolor=&amp;quot;green&amp;quot; | Ok ||bgcolor=&amp;quot;green&amp;quot; | Ok || Drive GPIO&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | ADC&lt;br /&gt;
| [[ADC_max1027 | max1027]] || bgcolor=&amp;quot;green&amp;quot;| Ok for SLOW mode ||bgcolor=&amp;quot;green&amp;quot;| Ok ||bgcolor=#FF0000| NOK ||bgcolor=#FF0000| NOK || &lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| [[as1531 | as1531]] || bgcolor=&amp;quot;green&amp;quot;| Ok for SLOW mode ||bgcolor=&amp;quot;green&amp;quot;| Ok ||bgcolor=#FF0000| NOK ||bgcolor=#FF0000| NOK || &lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | DAC&lt;br /&gt;
| [[Max5821 | max5821]] || bgcolor=&amp;quot;green&amp;quot;| OK ||bgcolor=&amp;quot;green&amp;quot;| Ok, but not fully tested ||bgcolor=#FF0000| NOK ||bgcolor=#FF0000| NOK || &lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| [[Mcp4912 | mcp4912]] || bgcolor=&amp;quot;red&amp;quot;| NOK ||bgcolor=&amp;quot;green&amp;quot;| Ok ||bgcolor=#FF0000| NOK ||bgcolor=#FF0000| NOK || &lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| eeprom || 93LCxx ||bgcolor=&amp;quot;green&amp;quot;| OK ||bgcolor=&amp;quot;green&amp;quot;| OK ||bgcolor=#FF0000| NOK ||bgcolor=#FF0000| NOK || &lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| [[PWM]] || ||bgcolor=&amp;quot;green&amp;quot; |  OK  ||  bgcolor=&amp;quot;green&amp;quot; | OK    || bgcolor=&amp;quot;red&amp;quot; | NOK  || bgcolor=&amp;quot;red&amp;quot; | NOK || Drive imx27 pwm |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| [[Backlight]] || ||bgcolor=&amp;quot;green&amp;quot; |  OK  ||  bgcolor=&amp;quot;green&amp;quot; | OK    || bgcolor=&amp;quot;red&amp;quot; | NOK  || bgcolor=&amp;quot;red&amp;quot; | NOK ||&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| [[Led | led]] || || bgcolor=&amp;quot;green&amp;quot;| Ok || bgcolor=#FF0000 | NOk ||bgcolor=#FF0000 | NOk ||bgcolor=#FF0000 | NOk || Drive LED&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>SebastienR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Kernel-with-device-tree&amp;diff=11279</id>
		<title>Kernel-with-device-tree</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Kernel-with-device-tree&amp;diff=11279"/>
		<updated>2012-09-26T18:54:29Z</updated>

		<summary type="html">&lt;p&gt;SebastienR: /* dtb */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Background=&lt;br /&gt;
&lt;br /&gt;
The idea behind device tree is quite simple. When the kernel starts, it needs to initialize the drivers for the devices on the board. But often on embedded systems, devices can&#039;t be discover at running time. In this case, the Linux kernel has a c file that initialize the devices for the board. So the kernel must be modified/compiled for each board. &lt;br /&gt;
&lt;br /&gt;
Another way is to provide a small file that describe the board to the Linux kernel. When the kernel start, it reads this file (called dtb for Device Tree Binary) to know the devices on the board, and initialize usefull drivers. &lt;br /&gt;
&lt;br /&gt;
Some information on device tree may be found here:&lt;br /&gt;
* http://elinux.org/Device_Trees&lt;br /&gt;
* http://devicetree.org/Main_Page&lt;br /&gt;
* https://wiki.linaro.org/Boards/Origen/DeviceTree&lt;br /&gt;
* http://elinux.org/images/4/48/Experiences_With_Device_Tree_Support_Development_For_ARM-Based_SOC%27s.pdf&lt;br /&gt;
&lt;br /&gt;
=Compilation=&lt;br /&gt;
&lt;br /&gt;
To use device tree on arm, both bootloader (U-Boot) and kernel should be compiled with the support of device tree.&lt;br /&gt;
&lt;br /&gt;
==U-Boot==&lt;br /&gt;
{{Note|The APF27/U-boot 2012.04.01 patch 3.6, APF28/U-Boot 2012.04.01 patch 1.5 and APF51/U-Boot 2012.04.01 patch 1.5 are already configured to support device tree.}}&lt;br /&gt;
&lt;br /&gt;
To enable device tree on u-boot, it&#039;s quite simple:&lt;br /&gt;
* add &amp;quot;#define CONFIG_OF_LIBFDT&amp;quot; in the u-boot configuration file (include/configs/&amp;lt;board&amp;gt;.h).&lt;br /&gt;
&lt;br /&gt;
On armadeus SDK, this file is in this directory: buildroot/target/device/armadeus/&amp;lt;board&amp;gt;/&amp;lt;board&amp;gt;-u-boot-&amp;lt;version&amp;gt;.h&lt;br /&gt;
&lt;br /&gt;
For example, for u-boot 2012.04 on apf27, it&#039;s: buildroot/target/device/armadeus/apf27/apf27-u-boot-2012.04.h&lt;br /&gt;
&lt;br /&gt;
Nothing else needs to be done, because the u-boot image is build by the armadeus SDK with the command &amp;quot;make&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
NOTE: on u-boot 2012.04, the command bootm with device tree is broken. If you want to use it,&lt;br /&gt;
&lt;br /&gt;
you need to fix it with the following patch: http://git.denx.de/?p=u-boot.git;a=commit;h=1723997610ace497252d6f9a44ec76c06951ae43&lt;br /&gt;
&lt;br /&gt;
NOTE2: it&#039;s fixed on u-boot 2012.04.01 that&#039;s the current (since June 2012) release used on all the APF boards.&lt;br /&gt;
&lt;br /&gt;
==Linux==&lt;br /&gt;
&lt;br /&gt;
The kernel &amp;gt; 3.4 have already the support of some arm SoC.&lt;br /&gt;
* imxl (apf9328) : no&lt;br /&gt;
* imx27 (apf27) : yes&lt;br /&gt;
* imx51 (apf51) : yes&lt;br /&gt;
* imx28 (apf28) : yes&lt;br /&gt;
&lt;br /&gt;
The configuration file should have (should be done by default):&lt;br /&gt;
* CONFIG_MACH_IMX27_DT (on APF27)&lt;br /&gt;
* CONFIG_MACH_IMX51_DT (on APF51)&lt;br /&gt;
* CONFIG_MACH_MXS_DT (on APF28)&lt;br /&gt;
* CONFIG_SERIAL_IMX&lt;br /&gt;
* CONFIG_SERIAL_IMX_CONSOLE&lt;br /&gt;
&lt;br /&gt;
Nothing else needs to be done, because the kernel image is build by the armadeus SDK with the &amp;quot;make&amp;quot; command.&lt;br /&gt;
&lt;br /&gt;
==dtb==&lt;br /&gt;
&lt;br /&gt;
A dtb (Device Tree Binary) file is created from a dts (Device Tree Source) file.&lt;br /&gt;
&lt;br /&gt;
The kernel has already the support of device tree for imx27 ([[APF27]]), imx28 ([[APF28]]) and imx51 ([[APF51]]).&lt;br /&gt;
&lt;br /&gt;
But both board (apf28 and apf51) hasn&#039;t a dts file. So a file &amp;lt;board&amp;gt;.dts must be added&lt;br /&gt;
to in the directory arch/arm/boot/dts of the linux kernel.&lt;br /&gt;
&lt;br /&gt;
The armadeus SDK don&#039;t have support for dtb image generation. So you have to do it yourself.&lt;br /&gt;
* go to the directory &#039;&#039;buildroot/output/build/linux-&amp;lt;version&amp;gt;&#039;&#039;&lt;br /&gt;
* add the file &amp;lt;soc&amp;gt;-&amp;lt;board&amp;gt;.dts the directory &#039;&#039;arch/arm/boot/dts/&#039;&#039;&lt;br /&gt;
* build the dtb with the command:&lt;br /&gt;
&amp;lt;pre class=host&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../../host/usr/bin/arm-linux- &amp;lt;soc&amp;gt;-&amp;lt;board&amp;gt;.dtb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The file &amp;lt;soc&amp;gt;-&amp;lt;board&amp;gt;.dtb should appear in &#039;&#039;arch/arm/boot/&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=host&amp;gt;&lt;br /&gt;
$ cp buildroot/output/build/linux-3.5-rc5/arch/arm/boot/imx28-apf28.dtb /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Running=&lt;br /&gt;
&lt;br /&gt;
Start the U-Boot previously compiled, and then :&lt;br /&gt;
&lt;br /&gt;
* load the kernel in memory&lt;br /&gt;
* load the dtb in memory&lt;br /&gt;
* run the command bootm with 3 arguments: &amp;lt;kernel addr&amp;gt; - &amp;lt;dtb addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The second argument is &amp;quot;-&amp;quot;, it means that there isn&#039;t an initrd to load.&lt;br /&gt;
&lt;br /&gt;
For example, on [[APF27]], it should be something like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
BIOS&amp;gt; setenv consoledev ttymxc0&lt;br /&gt;
BIOS&amp;gt; setenv baudrate 115200&lt;br /&gt;
BIOS&amp;gt; setenv dtbaddr 0xa0800000&lt;br /&gt;
BIOS&amp;gt; tftp $loadaddr apf27-linux.bin&lt;br /&gt;
BIOS&amp;gt; tftp $dtbaddr imx27-apf27.dtb&lt;br /&gt;
BIOS&amp;gt; setenv consoledev ttymxc0&lt;br /&gt;
BIOS&amp;gt; setenv console console=$consoledev,115200&lt;br /&gt;
BIOS&amp;gt; setenv bootargs ${console} earlyprintk&lt;br /&gt;
BIOS&amp;gt; run addnfsargs addipargs&lt;br /&gt;
BIOS&amp;gt; bootm $loadaddr - $dtbaddr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the APF27, 28 and 51 with the latest U-Boot version things are even simpler:&lt;br /&gt;
* Device Tree can be loaded from the Flash memory&lt;br /&gt;
* The variable fdt_addr_r defines the RAM address to load the DTB structure and will be used to notify the kernel of the DT location in RAM&lt;br /&gt;
* APF27: Set the fdt_addr_r to A1000000 - APF28: set the fdt_addr_r to 41000000&lt;br /&gt;
* Some scripts are availaible to update the dtb partition: download_dtb (download the dtb in RAM from your local network) - flash_dtb (tranfert a dtb from RAM to flash) - update_dtb (download and flash a dtb)&lt;br /&gt;
* the boot scripts &#039;&#039;ubifsboot&#039;&#039;, &#039;&#039;nfsboot&#039;&#039; and &#039;&#039;mmcboot&#039;&#039; support booting a kernel with a DT&lt;br /&gt;
&lt;br /&gt;
Here is the example on the [[APF27]]:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
BIOS&amp;gt; setenv consoledev ttymxc0&lt;br /&gt;
BIOS&amp;gt; setenv fdt_addr_r a1000000 (with the apf27 - 41000000 with an apf28 - 91000000 with an apf51 )&lt;br /&gt;
BIOS&amp;gt; run update_kernel&lt;br /&gt;
BIOS&amp;gt; run update_dtb&lt;br /&gt;
BIOS&amp;gt; boot  (on the APF27 that now supports the NAND in DTS - use run nfsboot on the other boards)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is the NFSboot example on the [[APF28]] (For the time being boot crash while trying to attach eth0 PHY ):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
BIOS&amp;gt; setenv consoledev ttyAMA0&lt;br /&gt;
BIOS&amp;gt; setenv fdt_addr_r 41000000&lt;br /&gt;
BIOS&amp;gt; run update_dtb&lt;br /&gt;
BIOS&amp;gt; saveenv&lt;br /&gt;
BIOS&amp;gt; run nfsboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Remove DT boot===&lt;br /&gt;
* just in case you want to come back to normal boot:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
BIOS&amp;gt; setenv fdt_addr_r&lt;br /&gt;
BIOS&amp;gt; saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SebastienR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=UsingSyslog&amp;diff=11262</id>
		<title>UsingSyslog</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=UsingSyslog&amp;diff=11262"/>
		<updated>2012-09-19T16:53:04Z</updated>

		<summary type="html">&lt;p&gt;SebastienR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Calling syslog method from your C source code==&lt;br /&gt;
This part is quiet simple, but we need to correctly use each parameter.&lt;br /&gt;
First step is to declare us as syslog client :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
#include &amp;lt;syslog.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
    ...&lt;br /&gt;
    openlog(&amp;quot;program_name&amp;quot;, LOG_PID, LOG_USER);&lt;br /&gt;
    ...&lt;br /&gt;
    closelog();&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Then, you can call syslog from your code using printf like format :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    syslog(LOG_INFO, &amp;quot;%s called with %d arguments\n&amp;quot;, argv[0], argc);&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
If you compile the source file:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
// log_syslog.c&lt;br /&gt;
#include &amp;lt;syslog.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
    openlog(&amp;quot;program_name&amp;quot;, LOG_PID, LOG_USER);&lt;br /&gt;
    syslog(LOG_INFO, &amp;quot;%s called with %d arguments&amp;quot;, argv[0], argc - 1);&lt;br /&gt;
    closelog();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
With the command :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
itsme@mycomputer:~/log_syslog$ gcc log_syslog.c -o log-syslog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then run it 2 times :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
itsme@mycomputer:~/log_syslog$ ./log_syslog&lt;br /&gt;
itsme@mycomputer:~/log_syslog$ ./log_syslog pim pam poum&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You will probably obtain no result in shell, but you can take a look in your system log (/var/log/syslog or /var/log/messages)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
itsme@mycomputer:~/log_syslog$ tail -n 2 /var/log/syslog&lt;br /&gt;
Sep 19 18:46:49 mycomputer program_name[3022]: ./log_syslog called with 0 arguments&lt;br /&gt;
Sep 19 18:46:53 mycomputer program_name[3023]: ./log_syslog called with 3 arguments&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
We can notice, that the lines contain program_name[PID] pattern showing us the name we have specified in openlog and the pid of the process because we ask it with LOG_PID argument.&lt;/div&gt;</summary>
		<author><name>SebastienR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=UsingSyslog&amp;diff=11261</id>
		<title>UsingSyslog</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=UsingSyslog&amp;diff=11261"/>
		<updated>2012-09-19T16:50:53Z</updated>

		<summary type="html">&lt;p&gt;SebastienR: New page: ==Calling syslog method from your C source code== This part is quiet simple, but we need to correctly use each parameter. First step is to declare us as syslog client : &amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt; ....&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Calling syslog method from your C source code==&lt;br /&gt;
This part is quiet simple, but we need to correctly use each parameter.&lt;br /&gt;
First step is to declare us as syslog client :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
#include &amp;lt;syslog.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
    ...&lt;br /&gt;
    openlog(&amp;quot;program_name&amp;quot;, LOG_PID, LOG_USER);&lt;br /&gt;
    ...&lt;br /&gt;
    closelog();&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Then, you can call syslog from your code using printf like format :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    syslog(LOG_INFO, &amp;quot;%s called with %d arguments\n&amp;quot;, argv[0], argc);&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
if you compile the source file:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
// log_syslog.c&lt;br /&gt;
#include &amp;lt;syslog.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
	openlog(&amp;quot;program_name&amp;quot;, LOG_PID, LOG_USER);&lt;br /&gt;
	syslog(LOG_INFO, &amp;quot;%s called with %d arguments&amp;quot;, argv[0], argc - 1);&lt;br /&gt;
	closelog();&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
With the command :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
itsme@mycomputer:~/log_syslog$ gcc log_syslog.c -o log-syslog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then run it 2 times :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
itsme@mycomputer:~/log_syslog$ ./log_syslog&lt;br /&gt;
itsme@mycomputer:~/log_syslog$ ./log_syslog pim pam poum&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You will probably obtain no result in shell, but you can take a look in you&#039;re system log (/var/log/syslog or /var/log/messages)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
itsme@mycomputer:~/log_syslog$ tail -n 2 /var/log/syslog&lt;br /&gt;
Sep 19 18:46:49 mycomputer program_name[3022]: ./log_syslog called with 0 arguments&lt;br /&gt;
Sep 19 18:46:53 mycomputer program_name[3023]: ./log_syslog called with 3 arguments&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
We can notice, that the lines contain program_name[PID] pattern showing us the name we have specified in openlog and the pid of the process because we ask it with LOG_PID argument.&lt;/div&gt;</summary>
		<author><name>SebastienR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Development&amp;diff=11260</id>
		<title>Development</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Development&amp;diff=11260"/>
		<updated>2012-09-19T16:19:18Z</updated>

		<summary type="html">&lt;p&gt;SebastienR: /* Tutorials / Tips */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;On this page you will find useful information to develop software for your Armadeus board&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Project==&lt;br /&gt;
* [[Sources organisation | Armadeus project sources organisation]]&lt;br /&gt;
* [[GIT#Providing_modifications | How to submit patches with your modifications]]&lt;br /&gt;
* [[Buildroot Packages | Adding packages to Buildroot]]&lt;br /&gt;
* [[GIT|GIT usage on Armadeus]] and the way to inform us about your changes&lt;br /&gt;
* [[APF9328_and_APF27_migration_to_Linux_2.6.36 | APF9328 and APF27 migration to Linux 2.6.36]]&lt;br /&gt;
&lt;br /&gt;
==Tools/Debug==&lt;br /&gt;
* [[Toolchain|C/C++ Cross Compiler (Toolchain) installation]]&lt;br /&gt;
* [[GDB|Debugging with GDB and GDBserver]]&lt;br /&gt;
* [[QEMU | Simulate an Armadeus system under QEMU]]&lt;br /&gt;
* [[Eclipse| Eclipse IDE with GDB debugger]]&lt;br /&gt;
* [[ JTAG | Support JTAGKey and BDI2000 JTAG probes]]&lt;br /&gt;
&lt;br /&gt;
==Bootloader / U-Boot==&lt;br /&gt;
* [[U-boot patches|Description of U-boot&#039;s patches]]&lt;br /&gt;
* [[Functionalities#Bootloader|description of some U-Boot functionnalities]]&lt;br /&gt;
&lt;br /&gt;
==Linux==&lt;br /&gt;
* [[kernel drivers status list|Kernel driver status list for the APF boards]]&lt;br /&gt;
* [[Linux Debug |Tips to debug under Linux]]&lt;br /&gt;
* [[Linux drivers development|Instructions to develop Linux drivers for Armadeus]]&lt;br /&gt;
* [[Linux on i.MXL|Resources available on i.MXL Linux kernel development]]&lt;br /&gt;
* [[Oops, Linux crashes | Interpreting Linux kernel Oops (crashes)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Userland==&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;5&amp;quot; summary=&amp;quot;Hardware Add-Ons by functionnalities&amp;quot;&lt;br /&gt;
|----------------&lt;br /&gt;
|&lt;br /&gt;
===Tutorials / Tips===&lt;br /&gt;
* [[HelloWorld | How to create your first Linux C application for your board]]&lt;br /&gt;
* [[HelloWorldCpp |How to create your first Linux C++ application for your board]]&lt;br /&gt;
* [[Automatically launch your application]]&lt;br /&gt;
* [[UsingSyslog |How to log using syslog]]&lt;br /&gt;
* [[Floating Point usage]]&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
=== Libraries ===&lt;br /&gt;
* [[AsDevices | Armadeus specific library]]&lt;br /&gt;
&lt;br /&gt;
|----------------&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
===Graphical User Interface / Games===&lt;br /&gt;
* [[Qt/Embedded]]&lt;br /&gt;
* [[EFL|Enlightenment Foundation Libraries]]&lt;br /&gt;
* [[SDL Development|SDL]]&lt;br /&gt;
* [[Allegro|Allegro]]&lt;br /&gt;
* [[Mesa| Mesa 3D graphics library (OpenGL compatible)]]&lt;br /&gt;
* [[pygame]]&lt;br /&gt;
* [[Entertainment]]&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
===Scripts / Languages===&lt;br /&gt;
* [[Java package | Java]]&lt;br /&gt;
* [[Perl development | Perl]]&lt;br /&gt;
* [[Python development | Python]]&lt;br /&gt;
* [[Lua development | Lua]]&lt;br /&gt;
* [[Flot]] : Javascript plotting library for jQuery&lt;br /&gt;
|----------------&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
===Realtime applications===&lt;br /&gt;
* [[Real time on APF]]&lt;br /&gt;
** Linux shared time&lt;br /&gt;
** Linux real time&lt;br /&gt;
** [[Xenomai | Hard real time with Xenomai]]&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
=== Web ===&lt;br /&gt;
* [[Boa|Boa (Embedded Webserver)]]&lt;br /&gt;
* [[Links]]: lightweight textual mode Web browser&lt;br /&gt;
* [[Flot]] : Javascript plotting library for jQuery&lt;br /&gt;
|----------------&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
* [[Ngircd]] : an IRC server&lt;br /&gt;
* [[tftpd]] : adding a tftpboot server on apf&lt;br /&gt;
|----------------&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
===Robotics/Domotic===&lt;br /&gt;
* [[Robotic]]&lt;br /&gt;
* [[Domos Project]]&lt;br /&gt;
|----------------&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
===Third party non free ===&lt;br /&gt;
* [[Straton]]&lt;br /&gt;
|----------------&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Examples of projects==&lt;br /&gt;
* [[Applications]]&lt;br /&gt;
&lt;br /&gt;
==Miscellaneous==&lt;br /&gt;
* [[NEON HelloWorld | Hello World example in NEON]]&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* Things to know when porting x86 software to ARM: http://www.handhelds.org/minihowto/porting-software.html&lt;br /&gt;
* [http://free-electrons.com Some nice presentations on Linux Embedded]&lt;/div&gt;</summary>
		<author><name>SebastienR</name></author>
	</entry>
</feed>