nbhw16: add some improvements for nbhw16
Add a minimal image, nbhw16 config, beaglebone config, a ctrl script for nbhw16 and nodejs
This commit is contained in:
parent
d8eed29e30
commit
aeecb2648c
|
|
@ -2,22 +2,20 @@ inherit core-image
|
||||||
|
|
||||||
SUMMARY = "Test image"
|
SUMMARY = "Test image"
|
||||||
|
|
||||||
UBOOT_CONFIG = "sdcard"
|
|
||||||
|
|
||||||
KERNEL_IMAGETYPE = "uImage"
|
KERNEL_IMAGETYPE = "uImage"
|
||||||
|
|
||||||
IMAGE_FSTYPES_append = " tar.gz "
|
IMAGE_FSTYPES_append = " tar.gz "
|
||||||
|
|
||||||
IMAGE_FEATURES += " \
|
IMAGE_FEATURES_append = " \
|
||||||
tools-debug \
|
tools-debug \
|
||||||
"
|
"
|
||||||
|
|
||||||
IMAGE_FEATURES += " \
|
IMAGE_FEATURES_append = " \
|
||||||
package-management \
|
package-management \
|
||||||
ssh-server-openssh \
|
ssh-server-openssh \
|
||||||
"
|
"
|
||||||
|
|
||||||
BENCH_TOOLS += " \
|
BENCH_TOOLS = " \
|
||||||
tcpdump \
|
tcpdump \
|
||||||
lrzsz \
|
lrzsz \
|
||||||
lmbench \
|
lmbench \
|
||||||
|
|
@ -30,9 +28,16 @@ BENCH_TOOLS += " \
|
||||||
strongswan \
|
strongswan \
|
||||||
"
|
"
|
||||||
|
|
||||||
BENCH_TOOLS_cortexa9hf-neon_append += " cpuburn-neon "
|
EASY_EDITOR = " \
|
||||||
|
nano \
|
||||||
|
"
|
||||||
|
|
||||||
IMAGE_INSTALL += " \
|
BENCH_TOOLS_cortexa9hf-neon_append = " cpuburn-neon "
|
||||||
|
BENCH_TOOLS_cortexa8hf-neon_append = " cpuburn-neon "
|
||||||
|
|
||||||
|
PREFERED_VERSION-pn_nodejs = "4.4.5"
|
||||||
|
|
||||||
|
IMAGE_INSTALL_append = " \
|
||||||
linux-firmware \
|
linux-firmware \
|
||||||
linux-firmware-ath9k \
|
linux-firmware-ath9k \
|
||||||
hostapd \
|
hostapd \
|
||||||
|
|
@ -50,11 +55,16 @@ IMAGE_INSTALL += " \
|
||||||
iptables \
|
iptables \
|
||||||
pciutils \
|
pciutils \
|
||||||
kernel-modules \
|
kernel-modules \
|
||||||
|
kernel-devicetree \
|
||||||
|
node \
|
||||||
|
python-subprocess \
|
||||||
${BENCH_TOOLS} \
|
${BENCH_TOOLS} \
|
||||||
|
${EASY_EDITOR} \
|
||||||
"
|
"
|
||||||
|
|
||||||
IMAGE_INSTALL_cortex9hf-neon_append = " kernel-devicetree "
|
IMAGE_INSTALL_cortex9hf-neon_append = " kernel-devicetree "
|
||||||
IMAGE_INSTALL_cortex9hf_append = " kernel-devicetree "
|
IMAGE_INSTALL_cortex9hf_append = " kernel-devicetree "
|
||||||
|
IMAGE_INSTALL_append_am335x-nbhw16 = " nbhw16-ctrl "
|
||||||
|
|
||||||
LICENSE = "BSD"
|
LICENSE = "BSD"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
inherit core-image
|
||||||
|
|
||||||
|
SUMMARY = "Minimal image for bringup"
|
||||||
|
|
||||||
|
IMAGE_FEATURES += " \
|
||||||
|
package-management \
|
||||||
|
ssh-server-openssh \
|
||||||
|
"
|
||||||
|
|
||||||
|
IMAGE_INSTALL += " \
|
||||||
|
openssh-sftp-server \
|
||||||
|
bash \
|
||||||
|
ethtool \
|
||||||
|
i2c-tools \
|
||||||
|
lrzsz \
|
||||||
|
devmem2 \
|
||||||
|
"
|
||||||
|
|
||||||
|
LICENSE = "BSD"
|
||||||
|
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
DESCRIPTION = "NBHW16 python script to control the HW"
|
||||||
|
HOMEPAGE = "http://www.netmodule.com/"
|
||||||
|
LICENSE = "Proprietary"
|
||||||
|
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Proprietary;md5=0557f9d92cf58f2ccdd50f62f8ac0b28"
|
||||||
|
RDEPENDS_${PN} = "python-subprocess"
|
||||||
|
|
||||||
|
PV = "1.0.0"
|
||||||
|
|
||||||
|
SRC_URI = " \
|
||||||
|
file://nbhw16-ctrl.py \
|
||||||
|
"
|
||||||
|
|
||||||
|
do_install () {
|
||||||
|
install -D -m 0755 ${WORKDIR}/nbhw16-ctrl.py ${D}/${bindir}/nbhw16-ctrl
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,95 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
import time
|
||||||
|
from optparse import OptionParser
|
||||||
|
|
||||||
|
|
||||||
|
WLAN_INTERFACE = "wlan0"
|
||||||
|
init = None
|
||||||
|
|
||||||
|
|
||||||
|
def call_and_throw(cmd):
|
||||||
|
if subprocess.call(cmd, shell=True):
|
||||||
|
raise RuntimeError("Command {0} failed".format(cmd))
|
||||||
|
|
||||||
|
|
||||||
|
def write_to_modem(data, read=False):
|
||||||
|
global init
|
||||||
|
if init is None:
|
||||||
|
init = True
|
||||||
|
call_and_throw("stty -F /dev/ttyUSB0 -echo -echok -echoe")
|
||||||
|
|
||||||
|
f = open("/dev/ttyUSB0", "r+")
|
||||||
|
f.write(data)
|
||||||
|
if read:
|
||||||
|
time.sleep(0.5)
|
||||||
|
while f.readable() and read:
|
||||||
|
data += f.readline()
|
||||||
|
f.close()
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
def get_modem():
|
||||||
|
interface = "eth2"
|
||||||
|
try:
|
||||||
|
call_and_throw("ifconfig {0} &> /dev/null".format(interface))
|
||||||
|
except:
|
||||||
|
interface = "usb0"
|
||||||
|
# Make sure that we now have a valid modem
|
||||||
|
call_and_throw("ifconfig {0} &> /dev/null".format(interface))
|
||||||
|
return interface
|
||||||
|
|
||||||
|
|
||||||
|
def setup_modem(provider):
|
||||||
|
if provider == "swisscom":
|
||||||
|
write_to_modem("AT^NDISDUP=1,1,\"gprs.swisscom.ch\"\r\n")
|
||||||
|
|
||||||
|
if provider == "salt":
|
||||||
|
write_to_modem("AT^NDISDUP=1,1,\"click\"\r\n")
|
||||||
|
|
||||||
|
call_and_throw("udhcpc -i {0}".format(get_modem()))
|
||||||
|
|
||||||
|
|
||||||
|
def setup_ap():
|
||||||
|
call_and_throw("ifconfig {0} 192.168.0.1".format(WLAN_INTERFACE))
|
||||||
|
# Start udhcpd with config from /etc/udhcpd.conf
|
||||||
|
call_and_throw("udhcpd")
|
||||||
|
|
||||||
|
|
||||||
|
def setup_routing():
|
||||||
|
f = open("/proc/sys/net/ipv4/ip_forward", "w")
|
||||||
|
f.write("1\n")
|
||||||
|
f.close()
|
||||||
|
call_and_throw("iptables -t nat -A POSTROUTING -o {0} -j MASQUERADE".
|
||||||
|
format(get_modem()))
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
usage = "usage: %prog [options] arg"
|
||||||
|
parser = OptionParser(usage)
|
||||||
|
parser.add_option("-m", "--modem", action="store_true", dest="modem",
|
||||||
|
help="Create connection over GSM/UMTS/LTE Modem",
|
||||||
|
default=False)
|
||||||
|
parser.add_option("-c", "--connection",
|
||||||
|
action="store_const", dest="connection",
|
||||||
|
help="Provider of the modem connection (swisscom/salt)",
|
||||||
|
default="swisscom")
|
||||||
|
parser.add_option("-a", "--ap", action="store_true", dest="ap",
|
||||||
|
help="Create an access point", default=False)
|
||||||
|
parser.add_option("-r", "--routing", action="store_true", dest="routing",
|
||||||
|
help="Enable routing trough modem", default=False)
|
||||||
|
|
||||||
|
(options, args) = parser.parse_args()
|
||||||
|
|
||||||
|
if options.modem:
|
||||||
|
setup_modem(options.connection)
|
||||||
|
|
||||||
|
if options.ap:
|
||||||
|
setup_ap()
|
||||||
|
|
||||||
|
if options.routing:
|
||||||
|
setup_routing()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
Bugfix for --no-registry in nodejs-v0.12.2
|
||||||
|
|
||||||
|
diff -u -r node-v0.12.2_def/deps/npm/lib/cache/caching-client.js node-v0.12.2/deps/npm/lib/cache/caching-client.js
|
||||||
|
--- node-v0.12.2_def/deps/npm/lib/cache/caching-client.js 2015-04-01 01:13:01.000000000 +0300
|
||||||
|
+++ node-v0.12.2/deps/npm/lib/cache/caching-client.js 2015-05-18 00:47:10.738599686 +0300
|
||||||
|
@@ -67,6 +67,22 @@
|
||||||
|
var cacheBase = cacheFile(npm.config.get("cache"))(uri)
|
||||||
|
var cachePath = path.join(cacheBase, ".cache.json")
|
||||||
|
|
||||||
|
+ if (parsed.host === "noregistry") (function() {
|
||||||
|
+ var stat = null
|
||||||
|
+ var file = npm.config.get("cache") + parsed.pathname + "/.cache.json"
|
||||||
|
+ try {
|
||||||
|
+ stat = fs.statSync(cachePath)
|
||||||
|
+ } catch (ex) {}
|
||||||
|
+ if (!stat) try {
|
||||||
|
+ stat = fs.statSync(file)
|
||||||
|
+ cachePath = file
|
||||||
|
+ } catch (ex) {
|
||||||
|
+ stat = "Registry not defined and registry files not found: \"" +
|
||||||
|
+ cachePath + "\", \"" + file + "\"."
|
||||||
|
+ throw new Error(stat)
|
||||||
|
+ }
|
||||||
|
+ })()
|
||||||
|
+
|
||||||
|
// If the GET is part of a write operation (PUT or DELETE), then
|
||||||
|
// skip past the cache entirely, but still save the results.
|
||||||
|
if (uri.match(/\?write=true$/)) {
|
||||||
|
@@ -83,12 +99,17 @@
|
||||||
|
}
|
||||||
|
catch (ex) {
|
||||||
|
data = null
|
||||||
|
+ if (parsed.host === "noregistry")
|
||||||
|
+ throw new Error("File \"" + cachePath+"\"" + " corrupted.")
|
||||||
|
}
|
||||||
|
|
||||||
|
params.stat = stat
|
||||||
|
params.data = data
|
||||||
|
|
||||||
|
- get_.call(client, uri, cachePath, params, cb)
|
||||||
|
+ if (parsed.host === "noregistry")
|
||||||
|
+ cb(null, data, JSON.stringify(data), { statusCode : 304 })
|
||||||
|
+ else
|
||||||
|
+ get_.call(client, uri, cachePath, params, cb)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
diff -u -r node-v0.12.2_def/deps/npm/lib/utils/map-to-registry.js node-v0.12.2/deps/npm/lib/utils/map-to-registry.js
|
||||||
|
--- node-v0.12.2_def/deps/npm/lib/utils/map-to-registry.js 2015-04-01 01:13:01.000000000 +0300
|
||||||
|
+++ node-v0.12.2/deps/npm/lib/utils/map-to-registry.js 2015-05-18 01:15:10.030569613 +0300
|
||||||
|
@@ -45,6 +45,8 @@
|
||||||
|
|
||||||
|
log.silly("mapToRegistry", "registry", registry)
|
||||||
|
|
||||||
|
+ if (!registry) return cb(null, "http://noregistry/" + name, {})
|
||||||
|
+
|
||||||
|
var auth = config.getCredentialsByURI(registry)
|
||||||
|
|
||||||
|
// normalize registry URL so resolution doesn't drop a piece of registry URL
|
||||||
|
|
@ -0,0 +1,86 @@
|
||||||
|
DESCRIPTION = "nodeJS Evented I/O for V8 JavaScript"
|
||||||
|
HOMEPAGE = "http://nodejs.org"
|
||||||
|
LICENSE = "MIT & BSD & Artistic-2.0"
|
||||||
|
LIC_FILES_CHKSUM = "file://LICENSE;md5=96aa1ac122c41f8c08a0683d4b2126b5"
|
||||||
|
|
||||||
|
DEPENDS = "openssl"
|
||||||
|
|
||||||
|
COMPATIBLE_MACHINE_armv4 = "(!.*armv4).*"
|
||||||
|
COMPATIBLE_MACHINE_armv5 = "(!.*armv5).*"
|
||||||
|
COMPATIBLE_MACHINE_mips64 = "(!.*mips64).*"
|
||||||
|
|
||||||
|
PV = "4.4.5"
|
||||||
|
|
||||||
|
SRC_URI = "git://github.com/nodejs/node.git;protocol=https;nobranch=1 \
|
||||||
|
file://no-registry.patch \
|
||||||
|
"
|
||||||
|
|
||||||
|
SRCREV = "6330f482c8d899ef54cd923157ffb8125098f79b"
|
||||||
|
|
||||||
|
S = "${WORKDIR}/git"
|
||||||
|
|
||||||
|
# v8 errors out if you have set CCACHE
|
||||||
|
CCACHE = ""
|
||||||
|
|
||||||
|
def map_nodejs_arch(a, d):
|
||||||
|
import re
|
||||||
|
|
||||||
|
if re.match('i.86$', a): return 'ia32'
|
||||||
|
elif re.match('x86_64$', a): return 'x64'
|
||||||
|
elif re.match('aarch64$', a): return 'arm64'
|
||||||
|
elif re.match('powerpc64$', a): return 'ppc64'
|
||||||
|
elif re.match('powerpc$', a): return 'ppc'
|
||||||
|
return a
|
||||||
|
|
||||||
|
ARCHFLAGS_arm = "${@bb.utils.contains('TUNE_FEATURES', 'callconvention-hard', '--with-arm-float-abi=hard', '--with-arm-float-abi=softfp', d)}"
|
||||||
|
GYP_DEFINES_append_mipsel = " mips_arch_variant='r1' "
|
||||||
|
ARCHFLAGS ?= ""
|
||||||
|
|
||||||
|
# Node is way too cool to use proper autotools, so we install two wrappers to forcefully inject proper arch cflags to workaround gypi
|
||||||
|
do_configure () {
|
||||||
|
export LD="${CXX}"
|
||||||
|
GYP_DEFINES="${GYP_DEFINES}" export GYP_DEFINES
|
||||||
|
# $TARGET_ARCH settings don't match --dest-cpu settings
|
||||||
|
./configure --prefix=${prefix} --without-snapshot --shared-openssl \
|
||||||
|
--dest-cpu="${@map_nodejs_arch(d.getVar('TARGET_ARCH', True), d)}" \
|
||||||
|
--dest-os=linux \
|
||||||
|
${ARCHFLAGS}
|
||||||
|
}
|
||||||
|
|
||||||
|
do_compile () {
|
||||||
|
export LD="${CXX}"
|
||||||
|
oe_runmake BUILDTYPE=Release
|
||||||
|
}
|
||||||
|
|
||||||
|
do_install () {
|
||||||
|
oe_runmake install DESTDIR=${D}
|
||||||
|
}
|
||||||
|
|
||||||
|
do_install_append_class-native() {
|
||||||
|
# use node from PATH instead of absolute path to sysroot
|
||||||
|
# node-v0.10.25/tools/install.py is using:
|
||||||
|
# shebang = os.path.join(node_prefix, 'bin/node')
|
||||||
|
# update_shebang(link_path, shebang)
|
||||||
|
# and node_prefix can be very long path to bindir in native sysroot and
|
||||||
|
# when it exceeds 128 character shebang limit it's stripped to incorrect path
|
||||||
|
# and npm fails to execute like in this case with 133 characters show in log.do_install:
|
||||||
|
# updating shebang of /home/jenkins/workspace/build-webos-nightly/device/qemux86/label/open-webos-builder/BUILD-qemux86/work/x86_64-linux/nodejs-native/0.10.15-r0/image/home/jenkins/workspace/build-webos-nightly/device/qemux86/label/open-webos-builder/BUILD-qemux86/sysroots/x86_64-linux/usr/bin/npm to /home/jenkins/workspace/build-webos-nightly/device/qemux86/label/open-webos-builder/BUILD-qemux86/sysroots/x86_64-linux/usr/bin/node
|
||||||
|
# /usr/bin/npm is symlink to /usr/lib/node_modules/npm/bin/npm-cli.js
|
||||||
|
# use sed on npm-cli.js because otherwise symlink is replaced with normal file and
|
||||||
|
# npm-cli.js continues to use old shebang
|
||||||
|
sed "1s^.*^#\!/usr/bin/env node^g" -i ${D}${exec_prefix}/lib/node_modules/npm/bin/npm-cli.js
|
||||||
|
}
|
||||||
|
|
||||||
|
do_install_append_class-target() {
|
||||||
|
sed "1s^.*^#\!${bindir}/env node^g" -i ${D}${exec_prefix}/lib/node_modules/npm/bin/npm-cli.js
|
||||||
|
}
|
||||||
|
|
||||||
|
PACKAGES =+ "${PN}-npm"
|
||||||
|
FILES_${PN}-npm = "${exec_prefix}/lib/node_modules ${bindir}/npm"
|
||||||
|
RDEPENDS_${PN}-npm = "bash python-shell python-datetime python-subprocess python-textutils"
|
||||||
|
|
||||||
|
PACKAGES =+ "${PN}-systemtap"
|
||||||
|
FILES_${PN}-systemtap = "${datadir}/systemtap"
|
||||||
|
|
||||||
|
|
||||||
|
BBCLASSEXTEND = "native"
|
||||||
Loading…
Reference in New Issue