Linux Software Features

From ESS-WIKI
Revision as of 06:18, 12 August 2016 by Daniel.hung (talk | contribs)
Jump to: navigation, search

Console

Disable serial debug console

Device Tree

Customize device tree

Gstreamer

audio volume control

gst-launch playbin2 uri=file:///tools/Advantech.avi \
video-sink="mfw_v4lsink device=/dev/video17" \
audio-sink="alsasink device=plughw:0" \
volume="volume=0"

SMPTE color bar

gst-launch videotestsrc ! autovideosink

video rotation

gst-launch playbin2 uri=file:///tools/Advantech.avi video-sink="mfw_isink rotation=0"
   (allowed rotation number: 0~7)

Java

How to install Java

Linux Kernel

Get kernel configs from running OS

You can get the .config file in running Linux OS by the following command.

# zcat /proc/config.gz > current.config

Furthermore, this feature is enabled by CONFIG_IKCONFIG_PROC.

Debug kernel panic and oops

To enable kernel symbols & debug information, you have to turn on these options and re-build kernel image. Just remember to keep the vmlinux & System.map files for debugging. They should be located at kernel root folder.

CONFIG_DEBUG_KERNEL=y
CONFIG_KALLSYMS=y
CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_INFO_REDUCED is not set

Here is an example of Oops case.

Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = d8e3c000
[00000000] *pgd=68d76831, *pte=00000000, *ppte=00000000
Internal error: Oops: 17 [#1] PREEMPT SMP ARM
Modules linked in:
CPU: 1 PID: 1030 Comm: pulseaudio Not tainted 3.14.52-svn2009 #3
task: d8f90000 ti: d8b6c000 task.ti: d8b6c000
PC is at dac_get_volsw+0x60/0x74
LR is at dac_get_volsw+0x5c/0x74
pc : [<80558e68>]    lr : [<80558e64>]    psr: 60070013
sp : d8b6dea8  ip : 00000000  fp : d8617400
r10: 7ef214f8  r9 : d8b6c000  r8 : d866e280
r7 : d861757c  r6 : d8617600  r5 : d8948800  r4 : 00000000
r3 : 00000000  r2 : 00000000  r1 : 00000001  r0 : 0000e564
Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
Control: 10c53c7d  Table: 68e3c04a  DAC: 00000015
Process pulseaudio (pid: 1030, stack limit = 0xd8b6c238)
Stack: (0xd8b6dea8 to 0xd8b6e000)
dea0:                   80558e08 00000001 d8948800 80535bf4 f01ad000 d861757c
dec0: 00000000 00000009 00000009 00000009 0035f648 00000000 00000000 00000000
dee0: 00000000 00000000 00000000 80967f28 00000007 8001a3c4 6df18338 d8b6dfb0
df00: 00000003 0035f960 7ef21aa4 d80cb410 7ef214f8 d87d53c0 c2c85512 0000000d
df20: d8b6c000 00000000 7ef217f4 800e7f4c d87d53c8 800ebfc0 6ddcf000 800d2e14
df40: 80962860 0000000d 0035ccf8 8069fa10 0000000d 800f19e4 d87d53c0 d87d53c0
df60: 7ef21d94 8069fc88 00000802 d87d53c0 7ef214f8 d87d53c0 c2c85512 0000000d
df80: d8b6c000 00000000 7ef217f4 800e8140 00361b58 00361cbc 00000000 00000036
dfa0: 8000e5e4 8000e460 00361b58 00361cbc 0000000d c2c85512 7ef214f8 0035cdd8
dfc0: 00361b58 00361cbc 00000000 00000036 00361ab0 00361b68 00000007 7ef217f4
dfe0: 6dfa73ac 7ef214ec 6df0efa4 76a5ecbc 20070010 0000000d 00000000 00000000
[<80558e68>] (dac_get_volsw) from [<80535bf4>] (snd_ctl_ioctl+0x5dc/0xb18)
[<80535bf4>] (snd_ctl_ioctl) from [<800e7f4c>] (do_vfs_ioctl+0x3dc/0x59c)
[<800e7f4c>] (do_vfs_ioctl) from [<800e8140>] (SyS_ioctl+0x34/0x5c)
[<800e8140>] (SyS_ioctl) from [<8000e460>] (ret_fast_syscall+0x0/0x38)
Code: e26330fc e585304c eb0501a0 e30e0564 (e5941000)
---[ end trace 7c4f0a24c41cc488 ]---

1. Check the PC (Program Counter) to find out where crash occurs.

PC is at dac_get_volsw+0x60/0x74

2. Grep dac_get_volsw() in System.map and get the symbol name address

$ cd <kernel root folder>
$ grep dac_get_volsw System.map
80558e08 t dac_get_volsw

Note: You can find the program counter is equaled to the sum of function entry address & offset.

pc : [<80558e68>] = 80558e08 + 0x60


3. Run addr2line to read the exact line number in source code.

$ arm-linux-gnueabi-addr2line -f -e vmlinux 80558e68
dac_get_volsw
/home/root/Projects/Linux/fsl-yocto-3.14.52_1.1.0/linux-imx/sound/soc/codecs/sgtl5000.c:335


4-1. In alternative way, you can run objdump to get the disassembly and source code mapping.

$ arm-linux-gnueabi-objdump -DS vmlinux > kernel.objdump

Note: This step may take very long time to generate the dump file. So, maybe you can stop it, once you can find the function symbols in the file.


4-2. Find dac_get_volsw() in kernel.objdump, and check the pc address [<80558e68>]. Then, you can find the problem occurs at the same line of source code.

80558e08 <dac_get_volsw>:
 *                      ------------------------------
 * userspace value      0xc0                         0
 */
static int dac_get_volsw(struct snd_kcontrol *kcontrol,
                         struct snd_ctl_elem_value *ucontrol)
{
80558e08:       e92d4038        push    {r3, r4, r5, lr}
80558e0c:       e1a05001        mov     r5, r1
 ...
        //TEST
        printk("crash test!\n");
80558e60:       eb0501a0        bl      806994e8 <printk>
        printk("%d\n", *p);
80558e64:       e30e0564        movw    r0, #58724      ; 0xe564
80558e68:       e5941000        ldr     r1, [r4]
80558e6c:       e3480080        movt    r0, #32896      ; 0x8080
80558e70:       eb05019c        bl      806994e8 <printk>

OpenCV

Open source computer vision

Python

Install Python

SSH

SSH connection

Yocto

In this section, we share some tips to use & modify BB files.

How to get multi-sources from GIT server

You can assign a name to distinguish the different GIT URIs, and define different destsuffix to save them respectively. Furthermore, to override SRCREV with the name, you can assign different commit id for each GIT branch.

SRC_URI = " \
    git://git.allseenalliance.org/gerrit/core/alljoyn.git;protocol=https;branch=${GIT_BRANCH};name=router;destsuffix=git/core/alljoyn \     
    git://git.allseenalliance.org/gerrit/services/base.git;protocol=https;branch=${GIT_BRANCH};name=services;destsuffix=git/services/base \
    file://modify_flags_for_yocto.patch"
SRCREV_router = "0d71b216bb3a3cadc615c3eda6f8200093c5e117"
SRCREV_services = "403cda579242701d42d2d7c0da308d63a8f46070"

Skip QA check

You can skip the specific QA check for your packages. For details, check the insane.bbclass bbclass in Yocto Project Reference Manual.

INSANE_SKIP_${PN} += "dev-so"

Create BB file to install pre-built SO binaries

Below is an example to add SO binaries into your image. You may need to modify the blue items for your make install path & library name.

SRC_URI = "file://test.tar.gz"

S = "${WORKDIR}/test"

do_install() {
    install -d ${D}/usr/lib
    cp -axr ${S}/lib*.* ${D}/usr/lib/
}

# Avoid package splitting into run-time and debug components
 INHIBIT_PACKAGE_DEBUG_SPLIT = "1"
# Avoid QA Error for already-stripped
 INHIBIT_PACKAGE_STRIP = "1"
# List the files for Package
 FILES_${PN} += "/usr/lib"
# Put all SO files in main rpm package
 FILES_SOLIBSDEV = ""
 INSANE_SKIP_${PN} += "dev-so"
# Set alias name to satisfy runtime dependencies
 RPROVIDES_${PN} = "libtest-1.00.so"

Install Node-RED packages

For Node-RED package installation, you can refer to the example below. Please note this example is based on the imyller's meta-nodejs layer for Node.js infrastructure.

SRC_URI =  "git://github.com/ADVANTECH-Corp/node-red-contrib-alljoyn.git;protocol=git"
SRCREV = "677333b1ed1a26a966c32d98af073d0b9a2b9088"

S = "${WORKDIR}/git"

# Inherit NPM class
inherit npm-install-global

# Do node-gyp rebuild in do_install() phase
NPM_INSTALL_FLAGS = "--unsafe-perm"

# Skip QA check
INSANE_SKIP_${PN} = "staticdev"