Portare la BeagleBone su OpenWRT

openwrt logo

openwrt logoLa BeagleBone è una scheda embedded ben supportata da diverse distribuzioni (embedded e non), in primis da Openembedded ed anche da Debian (qui un mio precedente articolo che tratta dell’argomento BeagleBone & Debian).

Personalmente però (sarò controcorrente) ritengo OpenWRT molto più versatile e semplice da gestire. Ecco perché in questo articolo vi farò vedere come si può aggiungere, in maniera relativamente semplice, li supporto di questa scheda ad OpenWRT.

Nell’articolo darò per scontato che il lettore sappia come gestire GIT e come si scrive un Makefile.

Innanzi tutto occorre prima capire come funziona OpenWRT e per farlo dobbiamo scaricarci i sorgenti. Diamo il comando:

$ git clone git://nbd.name/openwrt.git

Una volta finito andiamo a vedere cosa contiene l’albero dei sorgenti di OpenWRT:

$ ls trunk/
BSDmakefile  Makefile  feeds.conf.default  rules.mk  toolchain/
Config.in    README    include/           scripts/  tools/
LICENSE      docs/     package/           target/

Per quello che dobbiamo fare noi l’unica directory che ci interessa è target/linux, cioe quella che contiene tutti i possibili kernel supportati da OpenWRT. Andiamo a vedere cosa c’è:

$ cd target/linux/
$ ls
Makefile  atheros/   cns3xxx/  kirkwood/  mvebu/     ramips/    xburst/

adm5120/  au1000/    cobalt/   lantiq/    omap24xx/  rb532/
adm8668/  avr32/     ep93xx/   malta/     omap4/     realview/
amazon/   brcm2708/  gemini/   mcs814x/   orion/     sibyte/
ar7/      brcm47xx/  generic/  mpc52xx/   ppc40x/    sparc/
ar71xx/   brcm63xx/  iop32x/   mpc83xx/   ppc44x/    uml/
at91/     cns21xx/   ixp4xx/   mpc85xx/   pxa/       x86/

Da una prima occhiata si vede che le piattaforme supportate son davvero tante! Quelle che ci interessano a noi sono generic (a comune per tutte le piattaforme) e omap24xx/omap4 (specifiche per le CPU della Texas Instruments serie OMAP).

Vediamo cosa c’è in generic:

$ ls generic/
PATCHES      config-3.3  config-3.7  files/  patches-3.3/  patches-3.7/
base-files/  config-3.6  config-3.8  image/  patches-3.6/  patches-3.8/

In pratica qui vediamo quali versioni del kernel sono supportate da OpenWRT. Infatti, nelle varie directory chiamate patches-x.y possiamo trovare le patch che il sistema di build di OpenWRT applicherà ad ogni versione del kernel supportata.

Nel file PATCHES troviamo la descrizione di queste patch:

$ cat generic/PATCHES
The patches-* subdirectories contain the kernel patches applied for every
OpenWrt target. All patches should be named ‘NNN-lowercase_shortname.patch’
and sorted into the following categories:
0xx – upstream backports

1xx – code awaiting upstream merge
2xx – kernel build / config / header patches
3xx – architecture specific patches
4xx – mtd related patches (subsystem and drivers)
5xx – filesystem related patches
6xx – generic network patches
7xx – network / phy driver patches
8xx – other drivers
9xx – uncategorized other patches

Ad ogni versione del kernel che verrà utilizzata sono infatti necessarie un certo numero di patch per far sì che questo si adegui alle necessità di OpenWRT (in particolare si vedano le patch da 2xx a 6xx). Questa è una prassi comune che quasi tutte le distribuzioni fanno in modo tale che il kernel abbia tutte quelle funzionalità richieste dalla specifica distro.

Bene, abbiamo allora dedotto che i kernel che possiamo usare sono 3.3, 3.6, 3.7 e 3.8, in particolare però le versioni esatte si vedono nel file include/kernel-version.mk:

$ cat include/kernel-version.mk | grep LINUX_VERSION
ifeq ($(LINUX_VERSION),3.3.8)
ifeq ($(LINUX_VERSION),3.6.11)
ifeq ($(LINUX_VERSION),3.7.7)
KERNEL_BASE=$(firstword $(subst -, ,$(LINUX_VERSION)))

Ok, ora andiamo nella directory specifica per la piattaforma OMAP4 (lo stesso varrebbe, analogamente, per OMAP2):

$ cd target/linux/omap4/
$ ls
Makefile  base-files/  config-default  image/  patches/

Qui i file e le directory notevoli sono: il Makefile e le directory image e patches.

Il Makefile descrive la piattaforma, la versione del kernel da usare e i parametri di compilazione:

$ cat Makefile
#
# Copyright (C) 2012 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk

ARCH:=arm
BOARD:=omap4
BOARDNAME:=TI OMAP4
FEATURES:=usb targz audio display

LINUX_VERSION:=3.3.8

CFLAGS:=-Os -pipe -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp
MAINTAINER:=Imre Kaloz <kaloz@openwrt.org>;

KERNELNAME:=”uImage”

DEFAULT_PACKAGES += uboot-omap4-omap4_panda

DEVICE_TYPE=developerboard

define Target/Description
    TI OMAP4
endef

include $(INCLUDE_DIR)/target.mk

$(eval $(call BuildTarget))

Nella directory patches ci sono invece le patch specifiche per la piattaforma, mentre in image c’è:

$ ls image/
Makefile  boot.script

Il file boot.script riguarda i comandi u-boot che però a noi non interessano, mentre nel Makefile troviamo:

$ cat image/Makefile
#
# Copyright (C) 2012 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/image.mk

define Image/Prepare
    cp $(LINUX_DIR)/arch/arm/boot/uImage $(KDIR)/uImage
endef

define Image/BuildKernel
    mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n ‘Boot Image’ -d boot.script $(BIN_DIR)/boot.scr
    cp $(KDIR)/uImage $(BIN_DIR)/openwrt-$(BOARD)-uImage
endef

define Image/Build
    $(call Image/Build/$(1),$(1))
endef

define Image/Build/jffs2-64k
    dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/openwrt-$(BOARD)-$(1).img bs=65536 conv=sync
endef

define Image/Build/jffs2-128k
    dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/openwrt-$(BOARD)-$(1).img bs=131072 conv=sync
endef

define Image/Build/squashfs
    $(call prepare_generic_squashfs,$(KDIR)/root.squashfs)
    dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/openwrt-$(BOARD)-$(1).img bs=131072 conv=sync
endef

$(eval $(call BuildImage))

Qui ci sono i comandi per la creazione delle immagini di boot. Questo è il punto dove noi dovremo mettere i comandi per generare il kernel della BeagleBone nella versione zImage e il file DTB per la sua configurazione.

Il kernel lo abbiamo già cross-compilato nel precedente articolo su Debian, quindi non ci resta che ritornare lì per poter analizzare lo stato dei sorgenti. Se andiamo nella directory KERNEL ottenuta dalla compilazione vediamo che abbiamo:

$ head KERNEL/Makefile
VERSION = 3
PATCHLEVEL = 8
SUBLEVEL = 0
EXTRAVERSION =
NAME = Unicycling Gorilla

# *DOCUMENTATION*
# To see a list of typical targets execute “make help”
# More info can be located in ./README
# Comments in this file are targeted only to the developer, do not

Quindi il kernel da usare dentro OpenWRT è il 3.8. Ci mancano però le patch per allinearci al kernel di OpenWRT; come fare? Una possibile soluzione è quella di creare un primo supporto di base senza patch specifiche per la BeagleBone, in modo tale che OpenWRT crei il suo kernel modificato, e quindi provare ad applicare le patch per la Debian. In questo modo otterremo un merge tra le patch di OpenWRT e quelle di Debian; è chiaro che i conflitti andranno gestiti a manina (ma è senz’altro il male minore).

Vediamo come fare passo dopo passo.

Innanzi tutto creiamo un supporto di base per la BeagleBone; io ho scelto di creare una nuova piattaforma chiamata omap3 (la CPU della BeagleBone fa parte della famiglia chiamata omap3). Ho semplicemente copiato il supporto OMAP2 togliendo un po’ di file ed integrandolo con quello di OMAP4 (che ha i parametri di compilazione simili):

$ tree target/linux/omap3/
target/linux/omap3/
|– Makefile
|– base-files
|   |– etc
|   |   |– config
|   |   |   |– fstab
|   |   |   |– network
|   |   |   `– wireless
|   |   |– hotplug.d
|   |   |   `– firmware
|   |   |       |– 10-bme-pmm-image
|   |   |       `– 20-p54spi-eeprom
|   |   |– init.d
|   |   |   `– watchdog
|   |   |– inittab
|   |   `– pointercal
|   `– lib
|       `– firmware
|           `– bc4fw.bin
|– beaglebone
|   |– config-3.8
|   `– target.mk
|– config-3.8
|– image
|   `– Makefile
`– patches-3.8

11 directories, 14 files

Quindi ho modificato il Makefile come segue:

$ cat target/linux/omap3/Makefile
#
# Copyright (C) 2013 Rodolfo Giometti <giometti@linux.it>
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk

ARCH:=arm
BOARD:=omap3
BOARDNAME:=TI OMAP-3
SUBTARGETS:=beaglebone
MAINTAINER:=Rodolfo Giometti <giometti@linux.it>
FEATURES:=targz squashfs jffs2 usb usbgadget display gpio audio

LINUX_VERSION:=3.8

define Target/Description
    TI OMAP-3
endef

CFLAGS:=-Os -pipe -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp

KERNELNAME:=”zImage dtbs”

DEFAULT_PACKAGES +=

include $(INCLUDE_DIR)/target.mk

$(eval $(call BuildTarget))

Dove si nota che ho specificato il kernel 3.8 ed ho impostato i flag di compilazione in modo da supportare il floating point hardware (come per Debian armhf). Poiché useremo l’u-boot che abbiamo usato con Debian ho anche modificato il Makefile nella directory image in modo tale che venga generato il file zImage (anziché uImage) e il file DTB:

$ cat target/linux/omap3/image/Makefile
#
# Copyright (C) 2013 Rodolfo Giometti <giometti@linux.it>
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/image.mk

TARGET_DTBS := am335x-bone

JFFS2_BLOCKSIZE=128k
JFFS2OPTS += –little-endian –pagesize=0x800 –no-cleanmarkers –pad

define Image/Build/DTB
    cp $(LINUX_DIR)/arch/$(ARCH)/boot/dts/$(1).dtb
                $(BIN_DIR)/$(IMG_PREFIX)-$(1).dtb
endef

define Image/BuildKernel
    $(CP) $(LINUX_DIR)/arch/arm/boot/zImage $(BIN_DIR)/$(IMG_PREFIX)-zImage
    chmod 0644 $(BIN_DIR)/$(IMG_PREFIX)-zImage
    $(foreach dtb,$(TARGET_DTBS),$(call Image/Build/DTB,$(dtb)))
endef

define Image/Build/squashfs
    $(call prepare_generic_squashfs,$(BIN_DIR)/$(IMG_PREFIX)-root.$(1))
endef

define Image/Build
    $(CP) $(KDIR)/root.$(1) $(BIN_DIR)/$(IMG_PREFIX)-root.$(1)
    $(call Image/Build/$(1),$(1))
endef

$(eval $(call BuildImage))

Le parti importanti stanno tutte nelle define Image/BuildKernel e Image/Build/DTB.

A questo punto non ci resta che configurare OpenWRT affinché compili una immagine del kernel da cui partire. Diamo il comando:

$ make menuconfig

ed impostiamo il Target System e il Subtarget come segue:

OpenWrt Barrier Breaker (r35691) Configuration
 ??????????????????????????????????????????????????????????????????????????????
  ?????????????????????????? OpenWrt Configuration ??????????????????????????
  ?  Arrow keys navigate the menu.  <Enter> selects submenus —>.          ?  
  ?  Highlighted letters are hotkeys.  Pressing <Y> includes, <N> excludes, ?  
  ?  <M> builds as package.  Press <Esc><Esc> to exit, <?> for Help, </>    ?  
  ?  for Search.  Legend: [*] built-in  [ ] excluded  <M> package  < >      ?  
  ? ??????????????????????????????????????????????????????????????????????? ?  
  ? ?     Target System (TI OMAP-3)  —>                                 ? ?  
  ? ?     Subtarget (beaglebone)  —>                                    ? ?  
  ? ?     Target Profile (Default)  —>                                  ? ?  
  ? ?     Target Images  —>                                             ? ?  
  ? ?     Global build settings  —>                                     ? ?  
  ? ? [*] Advanced configuration options (for developers)  —>           ? ?  
  ? ? [ ] Build the OpenWrt SDK                                           ? ?

Consiglio anche di abilitare l’opzione Use ccache in Advanced configuration options (for developers) e di impostare la voce Target Images come segue:

OpenWrt Barrier Breaker (r35691) Configuration
 ??????????????????????????????????????????????????????????????????????????????
  ?????????????????????????????? Target Images ??????????????????????????????
  ?  Arrow keys navigate the menu.  <Enter> selects submenus —>.          ?  
  ?  Highlighted letters are hotkeys.  Pressing <Y> includes, <N> excludes, ?  
  ?  <M> builds as package.  Press <Esc><Esc> to exit, <?> for Help, </>    ?  
  ?  for Search.  Legend: [*] built-in  [ ] excluded  <M> package  < >      ?  
  ? ??????????????????????????????????????????????????????????????????????? ?  
  ? ? [*] ramdisk  —>                                                   ? ?  
  ? ? — Root filesystem archives                                        ? ?  
  ? ? [ ] cpio.gz                                                         ? ?  
  ? ? [*] tar.gz                                                          ? ?  
  ? ? — Root filesystem images                                          ? ?  
  ? ? — Image Options                                                   ? ? 

Questo ci permetterà di ottenere, una volta finito il port, una immagine del kernel con dentro un rootfs minimale che verrà esploso in un ramdisk al boot, in modo da non dover toccare il rootfs sulla microSD.

Salviamo la configurazione e diamo:

$ make V=99

Ad un certo punto può darsi che la compilazione fallisca perché il nostro kernel non è ancora completo; poco male però a noi interessa che OpenWRT abbia applicato le sue patch al kernel vanilla in modo che poi noi ci possiamo aggiungere quelle Debian. I sorgenti li trovamo in build_dir/target-arm_v7-a_uClibc-0.9.33.2_eabi/linux-omap3_beaglebone/linux-3.8/.

Prima però prendiamo le patch cher ci servono dal kernel Debian eseguendo il comando GIT che segue nella directory KERNEL:

$ git format-patch -C -n -o /tmp/PATCHES v3.8..HEAD~1

In /tmp/PATCHES verranno allora messe tutte le patch da portare dentro OpenWRT (da notare l’uso del parametro HEAD~1 poiché l’ultima patch è vuota). Come si vede sono un bel numero… ma con un po’ di pazienza e con un po’ di fortuna si potrà portare la nave in porto!

Ora andiamo nella directory dove OpenWRT ha messo i sorgenti del kernel:

$ cd build_dir/target-arm_v7-a_uClibc-0.9.33.2_eabi/linux-omap3_beaglebone/linux-3.8/

e creiamo un repository GIT di lavoro temporaneo (in realtà questa procedura andrebbe fatta con il tool quilt ma io preferisco GIT):

$ git init && git add . && git commit -s -m “Initial import” && git tag v3.8

Questo ci serve per poter poi generare le patch in maniera facile ed ordinata. Una volta creato il nostro bel repository di lavoro iniziamo ad applicarci le patch di Debian che abbiamo messo nella directory /tmp/PATCHES:

$ for p in /tmp/PATCHES/* ; do echo “—-> $p” ; git am $p || break ; rm $p ; done

Con questo comando non facciamo altro che prendere, una per una, le patch di Debian e le applichiamo al nostro kernel modificato per OpenWRT. Se la patch applica correttamente, il nostro script la cancellerà automaticamente, mentre in caso di errore si fermerà subito dandoci la possibilita di analizzare cosa è andato storto.

Lanciamolo, quindi:

$ for p in /tmp/PATCHES/* ; do echo “—-> $p” ; git am $p || break ; rm $p ; done
—-> /tmp/PATCHES/0001-Without-MACH_-option-Early-printk-DEBUG_LL.patch
Applying: Without MACH_ option Early printk (DEBUG_LL)
Auto packing the repository for optimum performance. You may also
run “git gc” manually. See “git help gc” for more information.
Counting objects: 44612, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (44056/44056), done.
Writing objects: 100% (44612/44612), done.
Total 44612 (delta 3761), reused 0 (delta 0)
Removing duplicate objects: 100% (256/256), done.
—-> /tmp/PATCHES/0002-ARM-OMAP-Hack-AM33xx-clock-data-to-allow-JTAG-use.patch
Applying: ARM: OMAP: Hack AM33xx clock data to allow JTAG use
—-> /tmp/PATCHES/0003-fb-Rework-locking-to-fix-lock-ordering-on-takeover.patch
Applying: fb: Rework locking to fix lock ordering on takeover

—-> /tmp/PATCHES/0072-pwm-pwm_test-Driver-support-for-PWM-module-testing.patch
Applying: pwm: pwm_test: Driver support for PWM module testing
error: patch failed: drivers/pwm/Kconfig:191
error: drivers/pwm/Kconfig: patch does not apply
error: patch failed: drivers/pwm/Makefile:16
error: drivers/pwm/Makefile: patch does not apply
Patch failed at 0001 pwm: pwm_test: Driver support for PWM module testing
When you have resolved this problem run “git am –resolved”.
If you would prefer to skip this patch, instead run “git am –skip”.
To restore the original branch and stop patching run “git am –abort”.

Ok, abbiamo un errore sulla patch 0072-pwm-pwm_test-Driver-support-for-PWM-module-testing.patch! Annulliamo il comando git am e proviamo ad applicare la patch a manina (nota: si potrebbe usare anche git apply):

$ git am –abort
$ patch -p1 < /tmp/PATCHES/0072-pwm-pwm_test-Driver-support-for-PWM-module-testing.patch
patching file drivers/pwm/Kconfig
Hunk #1 succeeded at 17 with fuzz 2 (offset -174 lines).
patching file drivers/pwm/Makefile
Hunk #1 FAILED at 16.
1 out of 1 hunk FAILED — saving rejects to file drivers/pwm/Makefile.rej
patching file drivers/pwm/pwm_test.c

Se diamo il comado git status possiamo vedere cosa è successo:

$ git status
# On branch master
# Changes not staged for commit:
#   (use “git add <file>…” to update what will be committed)
#   (use “git checkout — <file>…” to discard changes in working directory)
#
#    modified:   drivers/pwm/Kconfig
#
# Untracked files:
#   (use “git add <file>…” to include in what will be committed)
#
#    drivers/pwm/Makefile.rej
#    drivers/pwm/pwm_test.c
no changes added to commit (use “git add” and/or “git commit -a”)

Ok, abbiamo un reject nel file drivers/pwm/Makefile.rej. Vediamo cosa c’è e correggiamo l’errore. Facciamo quindi il commit avendo l’accortezza di mantenere l’autore e il messaggio di commit originale (per documentazione futura):

$ cat /tmp/PATCHES/0072-pwm-pwm_test-Driver-support-for-PWM-module-testing.patch | awk ‘/^—$/ { exit } ; { print }’ | git commit -s -F –

Ok, ora possiamo andare avanti; canceliamo la patch appena applicata e rilanciamo il nostro script:

$ rm /tmp/PATCHES/0072-pwm-pwm_test-Driver-support-for-PWM-module-testing.patch
$ for p in /tmp/PATCHES/* ; do echo “—-> $p” ; git am $p || break ; rm $p ; done
—-> /tmp/PATCHES/0073-ARM-OMAP2-PWM-limit-am33xx_register_ehrpwm-to-soc_is.patch
Applying: ARM: OMAP2: PWM: limit am33xx_register_ehrpwm to soc_is_am33xx, fixes boot on Beagle/Panda
—-> /tmp/PATCHES/0074-pwm-export-of_pwm_request.patch
Applying: pwm: export of_pwm_request
—-> /tmp/PATCHES/0075-pwm-pwm-tiehrpwm-Update-the-clock-handling-of-pwm-ti.patch
Applying: pwm: pwm-tiehrpwm: Update the clock handling of pwm-tiehrpwm driver
—-> /tmp/PATCHES/0076-ARM-AM33XX-clk-Add-clock-node-for-EHRPWM-TBCLK.patch
Applying: ARM: AM33XX: clk: Add clock node for EHRPWM TBCLK
—-> /tmp/PATCHES/0077-am33xx.dtsi-enable-MMC-HSPE-bit-for-all-3-controller.patch
Applying: am33xx.dtsi: enable MMC HSPE bit for all 3 controllers
….

Andando avanti, la procedura mi si è ribloccata alla patch 0138-arm-add-definition-of-strstr-to-decompress.c.patch ma può darsi che a voi vada tutto liscio (dipende dallo stato del kernel e delle patch che usate); in ogni caso dovrete correggere tutti gli errori fino alla fine come ho fatto vedere prima.

Una volta finito non ci resta che prendere le patch e darle ad OpenWRT:

$ git format-patch -C -n –no-renames -o ../../../../target/linux/omap3/patches-3.8/ v3.8
../../../../target/linux/omap3/patches-3.8/0001-Without-MACH_-option-Early-printk-DEBUG_LL.patch
../../../../target/linux/omap3/patches-3.8/0002-ARM-OMAP-Hack-AM33xx-clock-data-to-allow-JTAG-use.patch
../../../../target/linux/omap3/patches-3.8/0003-fb-Rework-locking-to-fix-lock-ordering-on-takeover.patch

../../../../target/linux/omap3/patches-3.8/0282-iio-magnetometer-Add-STMicroelectronics-magnetometer.patch
../../../../target/linux/omap3/patches-3.8/0283-iio-stmsensors-buildfix.patch
../../../../target/linux/omap3/patches-3.8/0284-From-4384daddbf55ec6279720f4cc2bbf27668ac0dd3-Mon-Se.patch

Per finire, come file di configurazione per il kernel OpenWRT della nostra BeagleBone, possiamo pensare di usare quello di Debian; quindi copiamo il file KERNEL/.config in target/linux/omap3/beaglebone/config-3.8.

Cancelliamo il kernel vecchio e ricompiliamolo verificando che, questa volta, OpenWRT metta anche le nostre patch. Lo possiamo fare con il solito comando:

$ make target/linux/clean
make[1] target/linux/clean
make[2] -C target/linux clean
$ make V=99
make[1]: Entering directory `/home/giometti/Projects/selta/beaglebone/distro/openwrt/trunk’
make[2]: Entering directory `/home/giometti/Projects/selta/beaglebone/distro/openwrt/trunk’
make[3]: Entering directory `/home/giometti/Projects/selta/beaglebone/distro/openwrt/trunk/target/linux’
make[4]: Entering directory `/home/giometti/Projects/selta/beaglebone/distro/openwrt/trunk/target/linux/omap3′

Applying patch generic/993-mpcore_wdt_fix_wdioc_setoptions_handling.patch
patching file drivers/watchdog/mpcore_wdt.c

Applying patch generic/994-mpcore_wdt_fix_timer_mode_setup.patch
patching file arch/arm/include/asm/smp_twd.h
patching file drivers/watchdog/mpcore_wdt.c

Applying patch platform/0001-Without-MACH_-option-Early-printk-DEBUG_LL.patch
patching file arch/arm/mach-omap2/Kconfig

Applying patch platform/0002-ARM-OMAP-Hack-AM33xx-clock-data-to-allow-JTAG-use.patch
patching file arch/arm/mach-omap2/cclock33xx_data.c

Perfetto! Le patch sono state applicate, ora non ci resta che attendere la fine di tutta la compilazione; una volta finito infatti nella directory bin/omap3 avremo:

$ ls bin/omap3/
md5sums                                   openwrt-omap3-beaglebone-zImage
openwrt-omap3-beaglebone-am335x-bone.dtb  packages/
openwrt-omap3-beaglebone-rootfs.tar.gz

Non ci resta che sostituire i file zImage e am335x-bone.dtb nella microSD con, rispettivamente, openwrt-omap3-beaglebone-zImage e openwrt-omap3-beaglebone-am335x-bone.dtb per verificare se funzionano:

$ cp bin/omap3/openwrt-omap3-beaglebone-zImage /media/boot/zImage
$ cp bin/omap3/openwrt-omap3-beaglebone-am335x-bone.dtb /media/boot/am335x-bone.dtb

Ora rimettiamo la microSD nella BeagleBone e se abbiamo fatto tutto bene alla fine otterremo:

BusyBox v1.19.4 (2013-02-20 21:11:07 CET) built-in shell (ash)
Enter ‘help’ for a list of built-in commands.

  _______                     ________        __
 |       |.—–.—–.—–.|  |  |  |.—-.|  |_
 |   –   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 —————————————————–
 BARRIER BREAKER (Bleeding Edge, r35691)
 —————————————————–
  * 1/2 oz Galliano         Pour all ingredients into
  * 4 oz cold Coffee        an irish coffee mug filled
  * 1 1/2 oz Dark Rum       with crushed ice. Stir.
  * 2 tsp. Creme de Cacao
 —————————————————–
root@OpenWrt:/#

Ricordo che per ottenere questa schermata nella console occorre premere Enter quando richiesto.

Nota finale: è possibile che otteniate qualche errore di inserimento dei moduli; in questo caso basterà configurare opportunamente il kernel.

Su Rodolfo Giometti

Ingegnere informatico libero professionista ed esperto GNU/Linux offre supporto per: - device drivers; - sistemi embedded; - sviluppo applicazioni industriali per controllo automatico e monitoraggio remoto; - corsi di formazione dedicati. Manutentore del progetto LinuxPPS (il sottosistema Pulse Per Second di Linux) contribuisce attivamente allo sviluppo del kernel Linux con diverse patch riguardanti varie applicazioni del kernel e dispositivi (switch, fisici di rete, RTC, USB, I2C, network, ecc.). Nei 15+ anni di esperienza su Linux ha lavorato con le piattaforme x86, ARM, MIPS & PowerPC.

Lascia un commento

Utilizzando il sito, accetti l'utilizzo dei cookie da parte nostra. maggiori informazioni

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi