ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2014年2月27日 星期四

Conversion to Dalvik format failed: Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.

Conversion to Dalvik format failed: Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.

ref:
  • http://notesfun.blogspot.tw/2013_12_01_archive.html
  • http://jcgogo.pixnet.net/blog/post/19609681-%5Bandroid%E9%8C%AF%E8%AA%A4%E8%A8%8A%E6%81%AF%5D-your-project-contains-error%28s%29,-please


copy 一段:
此時需要在專案上

點右鍵 → Build Path 將Android Dependecies Reamove 即可
.. 這個好像是 19 板的問題。

2014年2月26日 星期三

i2c bus, id match

wm8580.
static const struct i2c_device_id *i2c_match_id(const struct i2c_device_id *id,
                                                const struct i2c_client *client)
{
        while (id->name[0]) {
                if (strcmp(client->name, id->name) == 0)
                        return id;
                id++;
        }
        return NULL;
}
所以是比較 name

static int i2c_device_probe(struct device *dev)
{
        struct i2c_client       *client = i2c_verify_client(dev);
        struct i2c_driver       *driver;
        int status;

        printk("i2c_device_probe\n");

        if (!client)
                return 0;

        driver = to_i2c_driver(dev->driver);
        if (!driver->probe || !driver->id_table)
                return -ENODEV;
        client->driver = driver;
        if (!device_can_wakeup(&client->dev))
                device_init_wakeup(&client->dev,
                                        client->flags & I2C_CLIENT_WAKE);
        dev_dbg(dev, "probe\n");

        status = driver->probe(client, i2c_match_id(driver->id_table, client));
        if (status) {
                client->driver = NULL;
                i2c_set_clientdata(client, NULL);
        }
        return status;
}

kernel call user mode program : call_usermodehelper_exec

ref: http://www.ibm.com/developerworks/cn/linux/l-user-space-apps/

2014年2月21日 星期五

ALSA Asoc Layer. . reading notes

ref: ALSA Asoc

ALSA driver 新增一個 ASoc Layer 是為了 embedded system

讓 codec driver 獨立於 platform 之外,不用為每一個 embedded system chip 都寫一份 codec driver
在沒有 ASoc Layer 之前,codec WM8731 在 kernel 中總共寫了4 個 driver, 分別為了四個不同的 chip

目的簡述:
  • 獨立出 codec driver,不用針對chip platform 寫作
  • 簡化 I2S/PCM 介面,讓 連接 Soc 更容易
  • 電源管理
  • 統一 Pop, Click 聲的消除 介面
  • 允許 machine 增加對 sound card 的控制, 例如 AMP volume

.. 看來 都是介面 定義。

所以 ASoc Layer 把 audio system 分成:
  • Codec Driver : codec 本身控制,
  • Platform Driver : 例如 I2S, PCM 等 interface
  • Machine Driver : Audio 控制,例如 play pause audio

ref:
  • http://opensource.wolfsonmicro.com/cgi-bin/gitweb.cgi?p=linux-2.6-asoc.git;a=summary

2014年2月19日 星期三

2014年2月17日 星期一

免費中文字型

http://www.makefont.com/fonts.html

2014年2月14日 星期五

system revision.

bootloader 判斷 system revision 是 ?
放在 ATAG 中傳給 kernel,
kernel setup.c 中解開 ATAG, 把資料解開 show 在 /proc/cpuinfo:
# cat /proc/cpuinfo
Processor : ARMv7 Processor rev 6 (v7l)
BogoMIPS : 1599.07
Features : swp half thumb fastmult vfp edsp vfpv3 vfpv3d16 
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x2
CPU part : 0xcc9
CPU revision : 6

Hardware : mama2cb
Revision : 15034720
Serial  : 000fbaea041d1bff

android 的 /system/core/init/init.c 讀取 /proc/cpuinfo, 把每個 entry 解出,
用 property_set( ) 一一設定好system property


/system/core/init/init.c 負責很多 system property 設定的動作。

例如:從 kernel cmdline parsing ...
import_kernel_cmdline( )

讀取 /proc/cmdline
然後用
 import_kernel_nv( ):

       if (!strcmp(name,"qemu")) {
            strlcpy(qemu, value, sizeof(qemu));
        } else if (!strcmp(name,"androidboot.console")) {
            strlcpy(console, value, sizeof(console));
        } else if (!strcmp(name,"androidboot.mode")) {
            strlcpy(bootmode, value, sizeof(bootmode));
        } else if (!strcmp(name,"androidboot.serialno")) {
            strlcpy(serialno, value, sizeof(serialno));
        } else if (!strcmp(name,"androidboot.baseband")) {
            strlcpy(baseband, value, sizeof(baseband));
        } else if (!strcmp(name,"androidboot.carrier")) {
            strlcpy(carrier, value, sizeof(carrier));
        } else if (!strcmp(name,"androidboot.bootloader")) {
            strlcpy(bootloader, value, sizeof(bootloader));
        } else if (!strcmp(name,"androidboot.hardware")) {
            strlcpy(hardware, value, sizeof(hardware));
        }
parsing 需要的部份。

這樣 hardware 相關部份就可以完全交給 bootloader detect,

2014年2月5日 星期三

Segmentation fault -- Android C program debug

某個 C program - MccAccess,run 到後來會出現 Segmentation fault
然後沒有任何 message, 也沒有 core dump, kernel denug message 等。
要 debug (找出 fault 的位置)..

先是用 None-stripped version (包含 debug symbol).
在 out/target/product/ss7/obj/EXECUTABLES/MccAccess_intermediates/LINKED/ 下的 MccAccess 就是 none-stripped 版。

push 到system/bin/ 取代 stripped 版後。

再來,設定不限制 core dump size:
#ulimit -c unlimited

然後 run program, 讓他發生 core dump..

之後,在你所在目錄就會有 core dump file, 一般是 core.pid, pid 是那個 program 的 pid.
但是在這個 android 系統,沒有附加 pid,所以就是 core

接著開啟 gdb 吃 MccAccess 和 core:
# gdb /System/bin/MccAccess core

gdb 就會直接顯示最後的 fault 位置:
sh-4.2# gdb /system/bin/McuAccess core
GNU gdb (Linaro GDB) 7.3-2011.10
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "arm-none-linux-gnueabi".
For bug reporting instructions, please see:
...
Reading symbols from /system/bin/McuAccess...done.

warning: exec file is newer than core file.
[New LWP 1108]
[New LWP 1107]
[New LWP 1109]
[New LWP 1110]
Core was generated by `McuAccess'.
Program terminated with signal 11, Segmentation fault.
#0  memcpy () at bionic/libc/arch-arm/bionic/memcpy.S:203
203     bionic/libc/arch-arm/bionic/memcpy.S: No such file or directory.
        in bionic/libc/arch-arm/bionic/memcpy.S

不清楚的話 (像,是在 std c lib 中),可以用 bt 列出 stack backtrace:
(gdb) bt
#0  memcpy () at bionic/libc/arch-arm/bionic/memcpy.S:203
#1  0x0000b2fe in CheckMcuCmdID () at RT/Tony/MccAccess/FunctionDef.c:484
#2  0x0000b636 in CheckRxDataFromMcu ()
    at RT/Tony0921/MccAccess/FunctionDef.c:754
#3  0x0000b6e2 in RxUart (arg=)
    at RT/Tony/MccAccess/FunctionDef.c:780
#4  0x00011c10 in __thread_entry (func=0xb6d1 , arg=0x0,
    tls=) at bionic/libc/bionic/pthread.c:213
#5  0x000117d0 in pthread_create (thread_out=, attr=0x159f0,
    start_routine=0xb6d1 , arg=0x0) at bionic/libc/bionic/pthread.c:349
#6  0x00000000 in ?? ()


這樣就很清楚了。


ref: debugging segment fault with gdb

標籤

網誌存檔