ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2015年12月31日 星期四

system service feature enable/disable in android 5

ethernet service:
./services/java/com/android/server/SystemServer.java:674:                if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_ETHERNET)) {


    private void startOtherServices() {
        ...
        ...
                if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_ETHERNET)) {
                    mSystemServiceManager.startService(ETHERNET_SERVICE_CLASS);
                }
茶一下 FEATURE_ETHERNET...
./core/java/android/content/pm/PackageManager.java:1570:    public static final String FEATURE_ETHERNET = "android.hardware.ethernet";
這個: android.hardware.ethernet 是在:
frameworks/native/data/etc/android.hardware.ethernet.xml:

<permissions>
    <feature name="android.hardware.ethernet" />
</permissions>


這個 file 是被copy ...
device/fsl/imx6/sabreauto_6q.mk:

PRODUCT_COPY_FILES += \
        frameworks/native/data/etc/android.hardware.audio.output.xml:system/etc/permissions/android.hardware.audio.output.xml \
        frameworks/native/data/etc/android.hardware.sensor.compass.xml:system/etc/permissions/android.hardware.sensor.compass.xml \
        ....
        ...
        frameworks/native/data/etc/android.hardware.ethernet.xml:system/etc/permissions/android.hardware.ethernet.xml \
把這行刪掉以後,ethernet service 就不會起來了。

2015年12月30日 星期三

Nexus 9. Battery Low LED

原來Nexus 9 下面也有一棵白色 Led,
在完全沒電的時候,插上 usb 充電,他就會閃三下。
告訴你他還沒死。
這種情況持續充電 30min 後,出現白色電池符號,就可以長按power button 開機。
-- 電池顯示 4%

2015年11月21日 星期六

6s


這個突出來還真的討厭。

但是 4g速度好像有比較快


2015年11月16日 星期一

又壞了 buffalo

WCR HP GN

真的很容易壞

2015年10月5日 星期一

ipv6 test

ipv6 有 128 bit.(16x8)
address 的寫法改用 :

然後用 16 進制。
例如:fe80::204:9fff:fe03:5011

因為 byte 太多,所以其中有可能有很多 word是0。
為方便起見,連續的0 就用 :: 來取代。
但是為了避免混淆,只能取代一次。

kernel 有 support ipv6 的話,/proc/net/ 下,會有.. if_inet6 這個 file

然後就可以用 ip 這個 command 操作..

顯示目前 ipv6 的 address:
ip -6 addr show

1|root@sabreauto_6q:/ # ip -6 addr show
1: lo:  mtu 65536 
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
3: eth0:  mtu 1500 qlen 1000
    inet6 fe80::204:9fff:fe03:5123/64 scope link 
       valid_lft forever preferred_lft forever

看 ipv6 的 routing..
ip -6 route show

root@sabreauto_6q:/ # ip -6 route show
fe80::/64 dev eth0  metric 1024 
這是說, fe80::/64 的 subnet,都從 eth0進出


雙方都設好routing.. 就可以用 ping 了,ipv6 的 ping 叫 ping6

有時候,ping6 會出現 "connect: Invalid argument
..要加上 " -I eth0 "
還有... lollipop 的 ping6 好像有問題(還是 argument 不一樣?), 所以用 busybox ping6 比較 OK..
1|root@sabreauto_6q:/ # busybox ping6 -I eth0 fe80::ba27:ebff:feff:b123        
PING fe80::ba27:ebff:feff:b123 (fe80::ba27:ebff:feff:b123): 56 data bytes
64 bytes from fe80::ba27:ebff:feff:b123: seq=0 ttl=64 time=2.527 ms
64 bytes from fe80::ba27:ebff:feff:b123: seq=1 ttl=64 time=0.719 ms
64 bytes from fe80::ba27:ebff:feff:b123: seq=2 ttl=64 time=0.777 ms
^C
--- fe80::ba27:ebff:feff:b123 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.719/1.341/2.527 ms

Nexus 9


比 ipad air 小一些 ,但是比 mini 大。
解析度不錯 ,  當電子書ok 了。
看美漫也不會太小不清楚。

缺點是後面凸出來的鏡頭。要擺在桌上很麻煩 ,怕被磨到。

充電好慢。電池好像也不夠。應該沒辦法連續播放8小時。
拍照就標準 htc 那樣,軟體感,加上 google原生的對焦慢。

重量還好,但是加上附送的 磁性 cover 就太重了。
聲音應該算不錯吧,很大聲,以平板來說。




玩一下 game, 右上背面就會有點熱熱的。
更新到 6.0 以後,Launcher 常常會 freeze 住。

配合google books 來看電子書很 OK, 即使 pdf 也不錯,
新的 google books 好像會自動把文字區域放大對其中央,
配上這麼高的解析度,看起來很 OK

影片..當然是沒話說,可席看電子書 OK 的 4:3 在看電影就會多兩條黑線。
一堆撥放器的字幕黨都不 OK, 最後還是 MX player 正常波放。
hardware decode 也 OK
看影片的時候,果然,機器不會熱,耗電也號不多。

--------------
用了一個月,升級到6.0,機器常常自動重開,然後在這個畫面卡很久
用恢復原廠設定竟然卡住 ,所以只好開進 hboot, 用factory reset 清除 data cache

這裡花了10min... 還以為死掉了。


2015年9月22日 星期二

古老的...

如果不對 structure 內 field 操作。
就不需要知道 structure 的內部宣告。

所以像 tinyalsa 中 struct control
雖然 control_open 的傳回值是 struct control*
但是alsa stub 只會把 得到的 control struct*交給 tinyalsa 的 function 來操作。
所以 alsa stub 只需要宣告:
struct control;
就可以。

struct control {
    int fd;
    struct snd_ctl_card_info *card_info;
    struct ctl_pcm_info      *pcm_info_p;
    unsigned int              count_p;
    struct ctl_pcm_info      *pcm_info_c;
    unsigned int              count_c;
};

count_p 的 p 是 playback
coubt_c 是 capture

count 是數量,也就是 play, capture 的數量。

2015年9月18日 星期五

NuPlayer.cpp 的
void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
..
..
        case kWhatStart:
        {
         ..
         ..
            mOffloadAudio =
                canOffloadStream(audioMeta, (videoFormat != NULL),
                                 true /* is_streaming */, streamType);
            if (mOffloadAudio) {
                flags |= Renderer::FLAG_OFFLOAD_AUDIO;
            }


這個 kWhatStart 是由:
void NuPlayer::start() {
    (new AMessage(kWhatStart, id()))->post();
}
送出。

這邊的 caller:
android::NuPlayerDriver::start()
android::MediaPlayerService::decode(..)
..Binder..
mediaserver

typedef int snd_pcm_hw_param_t;
#define SNDRV_PCM_HW_PARAM_ACCESS       0       /* Access type */
#define SNDRV_PCM_HW_PARAM_FORMAT       1       /* Format */
#define SNDRV_PCM_HW_PARAM_SUBFORMAT    2       /* Subformat */
#define SNDRV_PCM_HW_PARAM_FIRST_MASK   SNDRV_PCM_HW_PARAM_ACCESS
#define SNDRV_PCM_HW_PARAM_LAST_MASK    SNDRV_PCM_HW_PARAM_SUBFORMAT

#define SNDRV_PCM_HW_PARAM_SAMPLE_BITS  8       /* Bits per sample */
#define SNDRV_PCM_HW_PARAM_FRAME_BITS   9       /* Bits per frame */
#define SNDRV_PCM_HW_PARAM_CHANNELS     10      /* Channels */
#define SNDRV_PCM_HW_PARAM_RATE         11      /* Approx rate */
#define SNDRV_PCM_HW_PARAM_PERIOD_TIME  12      /* Approx distance between
                                                 * interrupts in us
                                                 */
#define SNDRV_PCM_HW_PARAM_PERIOD_SIZE  13      /* Approx frames between
                                                 * interrupts
                                                 */
#define SNDRV_PCM_HW_PARAM_PERIOD_BYTES 14      /* Approx bytes between
                                                 * interrupts
                                                 */
#define SNDRV_PCM_HW_PARAM_PERIODS      15      /* Approx interrupts per
                                                 * buffer
                                                 */
#define SNDRV_PCM_HW_PARAM_BUFFER_TIME  16      /* Approx duration of buffer
                                                 * in us
                                                 */
#define SNDRV_PCM_HW_PARAM_BUFFER_SIZE  17      /* Size of buffer in frames */
#define SNDRV_PCM_HW_PARAM_BUFFER_BYTES 18      /* Size of buffer in bytes */
#define SNDRV_PCM_HW_PARAM_TICK_TIME    19      /* Approx tick duration in us */

把有範圍的歸在一起,再用:
#define SNDRV_PCM_HW_PARAM_FIRST_INTERVAL       SNDRV_PCM_HW_PARAM_SAMPLE_BITS
#define SNDRV_PCM_HW_PARAM_LAST_INTERVAL        SNDRV_PCM_HW_PARAM_TICK_TIME
然後就可以用這個function :
static inline int param_is_interval(int p)
{
    return (p >= SNDRV_PCM_HW_PARAM_FIRST_INTERVAL) &&
        (p <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL);
}
決定該參數是有範圍的 (upper, lower) 還是就一個值。

然後 structure:
struct snd_pcm_hw_params {
        unsigned int flags;
        struct snd_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK -
                               SNDRV_PCM_HW_PARAM_FIRST_MASK + 1];
        struct snd_mask mres[5];        /* reserved masks */
        struct snd_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL -
                                        SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1];
        struct snd_interval ires[9];    /* reserved intervals */
        unsigned int rmask;             /* W: requested masks */
        unsigned int cmask;             /* R: changed masks */
        unsigned int info;              /* R: Info flags for returned setup */
        unsigned int msbits;            /* R: used most significant bits */
        unsigned int rate_num;          /* R: rate numerator */
        unsigned int rate_den;          /* R: rate denominator */
        snd_pcm_uframes_t fifo_size;    /* R: chip FIFO size in frames */
        unsigned char reserved[64];     /* reserved for future */
};
也可以直接用 array ..
---- 所以適當安排 IOCTL code 還是有幫助的

2015年9月17日 星期四

Audio Input:

支援7 種 ananlog/digital source

analog input 提供 3 pairs of 2 inputs
Pair 可以規劃成:
stereo input with ground
single ended stereo input
differential stereo input
2 mono

提供 5 組 asynchronous digital I2S format input
每組可以有自己的 sample rate , clock phase
每組asynchronous I2S input 有自己的 bit clock, word select. 都是 input pin (slave)
I2S1 有 3 個 data line 可用做多 channel input
其他的 I2S 都只有 1 個 data line

Host I2S input 與 I2S output 共用 bit clock, word select
5 組 host input 區分為兩組:Host A, Host B
兩個 Host 各有自己的 bit clock, word select

Host A:
2 data input : IIS_SD_IN4, IIS_SD_IN5
bit clock, word select: IIS_SCK_IN45, IIS_WS_IN45

Host B:
3 data inputL IIS_SD_IN6, IIS_SD_IN7, IIS_SD_IN8
bit clock, word select: IIS_SCK_IN678, IIS_WS_IN678

上面兩組 Host 的 clk, ws pin: IIS_SCK_IN45, IIS_WS_IN45, IIS_SCK_IN678, IIS_WS_IN678 都可以做 input (slave) 或 output (master) 使用。

Host B 的 pin 可以configure 成 I2S mode 或是 TDM Mode



Audio Output:

3 stereo DACs.
4 synchronous Digital Port. (I2S and TDM)
另外,可藉由 I2C command, 將 5 組 asynchronous I2S input 設定變更為 asynchronous I2S output
Software Support asynchronous I2S output : IIS_SD_OUT3
每個 asynchronous I2S output 可以有不同的 sample rate 和 clock phase

asynchronous I2S output 的 bit clock, word select 都是 input (slave mode)
serial data pin 是 output

synchronous I2S output 使用 host I2S input 的 bit clock 和 word select
有 Host A, Host B 可以選

做 Most Mode 時, TDM output 使用 TDM_FSYNC_OUT, TDM_SCK_OUT 作為 frame sync和 bit clock
做 Slave Mode 時,改用 TDM_SYNC_IN, TDM_SCK_IN 作為 frame sync 和 bit clock

PIN 90.91 可設定為 S/PDIF output.

表列各 pin 的 三種功能。與所屬 groupe.
function 的變更以 groupe 為單位。


好像新版的 kernel 都已經 support uml (user-mode-linux) 了。
所以只要..
export ARCH=um
make defconfig
make all
就可以 build 出 uml

要注意的是, menuconfig 中的 UML Character Devices 裡面,最好全部都勾選。
這樣才有辦法在 xterm 中啟動。
否則會出現 channel error

2015年9月15日 星期二

5.1.1 - Z 的最後版本


有支援 exfat 喔。
-- 好像很久以前就支援了...

Kingmax 32G Pro 掛點


放在 Xperia Z 上用,還用不到半年說....

2015年9月11日 星期五

在 include/linux/kernel.h:
#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
就是 n/d 無條件進位。

2015年9月10日 星期四

stack backtrace in C++, CallStack

Android 5, CallStack() 的使用方式好像變了。
現在只要在 需要的地方,用:
 CallStack(LOG_TAG);
就可以了。
-- 當然,還要 include utils/CallStack.h

這只有 c++ 能用。
C 就不行。

使用到 libunwind 的 project 有.. (查 Android.mk):
  • libbacktrace
  • ltrace
  • compiler-rt
  • libcxxabi

2015年9月9日 星期三

AudioCommand 只有 AudioPolicyService 使用。
command 有:
  • start/stopTone
  • volume
  • parameters
  • voiceVolume
  • stopOutput
  • releaseOutput
  • createAudioPatch
  • releseAudioPatch
  • updateAudioPortList
  • updateAudioPatchList
  • setAuidioPortConfig

AUDIO_STREAM_XX 定義在 system/core/include/system/audio.h
/* Audio stream types */
typedef enum {
    /* These values must kept in sync with
     * frameworks/base/media/java/android/media/AudioSystem.java
     */
    AUDIO_STREAM_DEFAULT          = -1,
    AUDIO_STREAM_MIN              = 0,
    AUDIO_STREAM_VOICE_CALL       = 0,
    AUDIO_STREAM_SYSTEM           = 1,
    AUDIO_STREAM_RING             = 2,
    AUDIO_STREAM_MUSIC            = 3,
    AUDIO_STREAM_ALARM            = 4,
    AUDIO_STREAM_NOTIFICATION     = 5,
    AUDIO_STREAM_BLUETOOTH_SCO    = 6,
    AUDIO_STREAM_ENFORCED_AUDIBLE = 7, /* Sounds that cannot be muted by user
                                        * and must be routed to speaker
                                        */
    AUDIO_STREAM_DTMF             = 8,
    AUDIO_STREAM_TTS              = 9,

    AUDIO_STREAM_CNT,
    AUDIO_STREAM_MAX              = AUDIO_STREAM_CNT - 1,
} audio_stream_type_t;
有說明:這個順序要和 AudioSystem.java 一致。

AudioSystem 好像是所有 audio 的 hub
裡面都是 static function,
所以其他的 code 都可以置接用 AudioSystem::setAudioPortConfig( ), AudioSystem::get_audio_flinger( ).. etc
來使用 audio flinger, policy, manager 的服務。

2015年9月8日 星期二

先到 external/tinyalsa/Android.mk
LOCAL_MODULE:= libtinyalsa
然後 找有誰link ...
有關的有:
./hardware/imx/alsa/Android.mk
./hardware/libhardware/modules/usbaudio/Android.mk

./system/media/audio_route/Android.mk
./frameworks/base/cmds/bootanimation/Android.mk
bootanimation 的用的是自己的 audio_conf.
所以不看。

andio_route 的 target 是 libaidioroute, 查沒有我要用的。(只有 qcom. htc, asus, samsung 有用)
所以不看

hardware/imx/alsa/ 的 target 是 audio.primary$(TARGET_BOARD_PLATFORM)
source 只有 tinyalsa_hal.c (其他都是 header)

open_output_stream 是 function table.
AudioFlinger openOutput() 呼叫的。

在這裡印出 CallStack():
I/AudioFlinger(  152): loadHwModule() Loaded primary audio interface from Freescale i.MX Audio HW HAL (audio) handle 1
V/AudioFlinger(  152): openOutput(), module 1 Device 2, SamplingRate 48000, Format 0x000001, Channels 3, flags 2
D/AudioFlinger(  152): #00 pc 0000d061  /system/lib/libutils.so (android::CallStack::update(int, int)+52)
D/AudioFlinger(  152): #01 pc 0000d177  /system/lib/libutils.so (android::CallStack::CallStack(char const*, int)+38)
D/AudioFlinger(  152): #02 pc 00021c31  /system/lib/libaudioflinger.so
D/AudioFlinger(  152): #03 pc 00009d31  /system/lib/libaudiopolicyservice.so
D/AudioFlinger(  152): #04 pc 0001a029  /system/lib/libaudiopolicymanagerdefault.so (android::AudioPolicyManager::AudioPolicyManager(android::AudioPolicyClientInterface*)+1000)
D/AudioFlinger(  152): #05 pc 0000049d  /system/lib/libaudiopolicymanager.so (createAudioPolicyManager+16)
D/AudioFlinger(  152): #06 pc 00006afb  /system/lib/libaudiopolicyservice.so
D/AudioFlinger(  152): #07 pc 0000ec11  /system/lib/libutils.so (android::RefBase::incStrong(void const*) const+38)
D/AudioFlinger(  152): #08 pc 00001d5f  /system/bin/mediaserver
D/AudioFlinger(  152): #09 pc 0000169d  /system/bin/mediaserver
D/AudioFlinger(  152): #10 pc 000128f1  /system/lib/libc.so (__libc_init+44)
D/AudioFlinger(  152): #11 pc 00001938  /system/bin/mediaserver

2015年9月2日 星期三

imx6 sabreauto, audio_hw_primary logcat

I/AudioPolicyManager(  152): loadAudioPolicyConfig() loaded /system/etc/audio_policy.conf
W/audio_hw_primary(  152): card 0, id cs42888audio ,driver cs42888-audio, name cs42888-audio
W/audio_hw_primary(  152): out rate 48000
W/audio_hw_primary(  152): in rate 48000, channels 1 format 0
W/audio_hw_primary(  152): card 1, id imxspdif ,driver imx-spdif, name imx-spdif
W/audio_hw_primary(  152): out rate 0
W/audio_hw_primary(  152): in rate 44100, channels 2 format 3
V/audio_hw_primary(  152): headphone 0 ,headset 0 ,speaker 2, earpiece 0, 
I/AudioFlinger(  152): loadHwModule() Loaded primary audio interface from Freescale i.MX Audio HW HAL (audio) handle 1
W/audio_hw_primary(  152): open output stream devices 2, format 1, channels 3, sample_rate 48000, flag 2
V/audio_hw_primary(  152): adev_open_output_stream() normal buffer
W/audio_hw_primary(  152): opened out stream...1979414720, type 1
I/AudioFlinger(  152): HAL output buffer size 192 frames, normal sink buffer size 1152 frames
V/AudioFlinger(  152): MixerThread() id=2 device=0x2 type=0
V/AudioFlinger(  152): mSampleRate=48000, mChannelMask=0x3, mChannelCount=2, mFormat=1, mFrameSize=4, mFrameCount=192, mNormalFrameCount=1152
I/System  (  157): Loaded time zone names for "en_AU" in 100ms (69ms in ICU)
V/AudioMixer(  152): EffectQueryNumberEffects() numEffects=13
V/AudioMixer(  152): effect 0 is called Noise Suppression
V/AudioMixer(  152): effect 1 is called Acoustic Echo Canceler
V/AudioMixer(  152): effect 2 is called Automatic Gain Control
V/AudioMixer(  152): effect 3 is called Multichannel Downmix To Stereo
I/AudioMixer(  152): found effect "Multichannel Downmix To Stereo" from The Android Open Source Project

Install Hack font on Debian Jessie

就是這個 font: https://github.com/chrissimpkins/Hack

download 下來解開是 ttf 檔。

使用 font-manager 來安裝。
是 gnome 的 package.

啟動 font-manager 後,按齒輪icon. 選 install-fonts
然後去,一個一個 ttf 的選。
就完成了。

ttf font 會被 copy 到 ~/.fonts/Library/H/
-- 這是 link .. ~/.local/share/font-manager/Library

2015年8月27日 星期四

nvidia optimus : bumblebee in debian jessie

lenovo e431
原來 bios 中 display card 有得選:
內建和 switchable,
要選 switchable

然後 follow http://www.unixmen.com/how-to-make-nvidia-optimus-technology-work-properly-on-debian/

但是 run oprirun glsgear 的 framerate 跟 primerun 的結果一樣,都是 60fps
結果因為是 LCD panel, framerate 是固定的,..

所以看起來是有安裝成功


看來 bumbleblee 和 nvidia driver 是兩件事。
安裝了 nvidia-driver, run nvidis-settings 之後,產生了 /etc/X11/xorg.conf
結果 reboot 後, startx failed, 看 log, 說是 module: nvidia 找不到。

最後,刪除 /etc/X11/xorg.conf 後, startx OK

2015年8月26日 星期三

ref: https://github.com/CyanogenMod/android/commit/d33c1afc194cfc402f4e5edc37dbef1bafea35df

roomservice 好像是把 device 下一堆 vendor 管理的咚咚。
所以這個 commit 把一堆 vendor product 都拿掉了...

2015年8月21日 星期五

aosp project 下的 Makfile 怎麼來的..

因為 project root 不是一個 git project 啊。

是在 .repo/manifest.xml. 中:
  <project path="build" name="platform/build" groups="pdk,tradefed" >
    <copyfile src="core/root.mk" dest="Makefile" />
  </project>
所以是歸 build 這個 project 管的。
他就是 build/core/root.mk

src 是相對於 project 的path
dest 是箱對於 aosp 的 path

還有,只有在第一次 sync 得時候會 copy...

2015年8月18日 星期二

repo and manifest.xml -- revision

manifest.xml 每一個 project 都可以有自己的 revision, 寫在 revision attrib 中。
如果沒寫,就用 xml 一開頭寫的 default tag 的 revision

這個 revision, 對應到 git 的 refs/heads/*
像:
revision="kitkat-dev"
就是對應到 refs/heads/kitkat-dev

如果要 checkout tags
就要寫full path:
revision="refs/tags/android-5.0.2_r1"

repo and manifest.xml-- notdefault

manifest.xml 的 project attrib 有一個:groups
可以用來把一堆 project 區分為一些 group: pdk, intel, omap4, darwin, linux..
一個 project 可以同時屬於多個 groups

如果沒有 groups att, 就屬於 default

如果 groups 中有 'notdefault', 那麼如果沒有特別指定,在 sync 的時候,這個 project 就不會被 checkout

如果要 checkout notdefault 這個 group 的 project,
ref: http://www.cnblogs.com/mimamo/p/3948491.html
repo init -u https://android.googlesource.com/platform/manifest -g all
其中的 '-g all' 就代表 all groupe,包含 notdefault

另一個python script: check not git(ize) folders

上一篇: http://r40eubuntu.blogspot.tw/2011/03/python-check-git-no-git-folder.html

在更新過 python 版本後,好像沒辦法在 for loop 中更改 loop list 內容。
所以要改一下,



所以檢查 android source 與 repo, git 是否完整的 python script 就是:


他會先找出是否有哪個folder 還沒有 git 管轄
然後從 manifest.xml 找出所有的 project path。
檢查是不是所有 git folder 都有在 manifest.xml 中
檢查是不是所有 manifest.xml 的 project 都實際存在。

放在: https://github.com/checko/python_repo

python : 找出沒有在 git control 下的 folder

因為 vendor 給的 android source 沒有包含 git, repo 資訊,
所以只好採用 .. repo sync 一個相近的 source, 覆蓋後 commit

所以覆蓋後,要檢查是不是有沒被 versio control 的 folder:
用 python 寫:
import os

i=0
for root, dirlist, filelist in os.walk("./"):
        toremove=[]

        for ss in ['.repo','out']:
                if ss in dirlist:
                        toremove.append(ss)

        for ss in dirlist:
                gpath = os.path.join(root,ss,'.git')
                if os.path.isdir(gpath):
                        toremove.append(ss)

        for ss in toremove:
                dirlist.remove(ss)

        if (len(dirlist)==0) and (len(toremove)==0):
                print i, root
                i=i+1
因為 os.walk 會依照top down 的方式,到 dirlist 中搜尋。
所以就用修改 dirlist 的方式來作:
  • 先排除 .repo, out 目錄
  • 排除含有 .git 的次目錄
最後就可以印出來。

但是這個結果會把所有沒有 git control 的 folder, subfolder 都印出來,(因為他沒辦法判斷要從哪裡算起,是一個 project)
這部份要自己作。


這個動態刪除 dirlist 的作法在更換 python 版本的時候出了問題。
原來是在判斷包含 .git 後直接作 dirlist.remove(ss)
但是卻發現這樣會影像到下一個 ss (in dirlist) 的判斷。
所以只好先放在 toremove[] 中,最後再一次修改全部

放在: https://github.com/checko/python_repo

github 終於可以動了

github 可以動了。
根據每一個機器.account,要 copy account 的 dsa /rsa pub key 到 github 中。
然後就可以把 github 當 git server 用了。
create new project/repository 可以用 github 的介面完成。

這一篇 http://help.github.com/troubleshooting-ssh/ 有 ssh 的 trouble shooting.

github 可以為每一個 repo 建立一個 homepage,follow instruction。
http://pages.github.com/#project_page_generator
要注意的是,這個 default 的 homepage 產生需要時間,所以按下 button 後馬上去看會是 404 page。
要等大約 3 min (說明是說 10 min)才會出現。


ref:



用 https ,不用 ssh

如果有一些公司的mis 不願意開 ssh port,github 也有提供另一種 access 的方法:

需要 1.6.6 以上的 git (git --version 會顯示,ubuntu 10.10 的版本是 1.7)。
command:
$ git clone https://username@github.com/username/project.git username : 你在 github 使用的 username。
project : 你的 repository 名稱。

這個新版的 git 會 prompt 要你輸入 password。你就要輸入 你在 github 的 password。


ref: https://github.com/blog/642-smart-http-support



另外,在 proxy 後面,clone OK, push fail:
$ git push
error: The requested URL returned error: 403 while accessing https://github.com/checko/mdnsreponder_gingerbread.git/info/refs

fatal: HTTP request failed
可以參考這篇:http://blog.csdn.net/happyteafriends/article/details/11554043

修改該 repo 的 .git/config, 加上紅色部份...

[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = https://checko@github.com/checko/mdnsreponder_gingerbread.git

ref: https://github.com/markkolich/blog/blob/master/content/entries/pushing-to-an-http-git-remote-ref-on-ubuntu-1004-lts-with-git-1704-403-inforefs.md

git config 修改 remote:
git config 命令可以修改 config 檔。
cat config 出來看一下:
[core]
 repositoryformatversion = 0
 filemode = true
 bare = false
 logallrefupdates = true
[remote "origin"]
 fetch = +refs/heads/*:refs/remotes/origin/*
 url = https://checko@github.com/checko/python_repo.git
[branch "master"]
 remote = origin
 merge = refs/heads/master
修改 remote origin 的 url 就用:
$ git config remote.origin.url https://checko@github.com/checko/python_repo.git
就可以了。

2015年8月17日 星期一

加上 --mirror
export GIT_DIR=~/openssl.git
git init

git config --file ~/openssl.git/config --replace-all remote.aosp.url      git://robot/android5.0.2r1/platform/external/openssl
git config --file ~/openssl.git/config --replace-all remote.aosp.projname platform/external/openssl
git config --file ~/openssl.git/config --replace-all remote.aosp.fetch +refs/heads/*:refs/heads/*
git fetch --update-head-ok aosp --tags +refs/heads/*:refs/heads/*
git pack-refs --all --prune
git symbolic-ref -m 'manifest set tp refs/tags/android-5.0.2_r1' HEAD refs/tags/android-5.0.2_r1
git -c pack.thread=1 gc --auto

沒加 --mirror 的話。
GIT_DIR 會在 .repo/project-objects/platform/external/openssl.git
然後動做一樣。

最後的 checkout,在 --trace 中看不到一些動作。
所以要配盒source code 來看。

project.py:
def _InitWorkTree(self):
  dotgit = os.path.join(self.worktree,'.git')
  if not os.path.exist(gotgit):
    os.makedirs(dotgit)
    self._ReferenceGitDir(self.gitdir, dotgit, share_ref=True, copy_all=False)
    _lwrite(os.path.join(dotgit, HEAD). '%s\n" % self.GetRevisionId())
    
    cmd = ['read-tree', '--reset', '-u']
    cmd.append('-v')
    cmd.append(HEAD)
    if GitCommand(self,cmd),Wait() != 0
      raise GitError("cannot initialize work Tree")

    self._CopyAndLinkFiles()
裡面的東西,幾忽就是 git 在做的事...
copy .git 的內容。

2015年8月14日 星期五

https://www.chromium.org/chromium-os/quick-start-guide

build 玩以後,燒到usb,
切到 developement mode (console).
sudo enable_usb_boot

插入usb
按 Ctrl-U

就會在 usb 開機了。

2015年8月12日 星期三

Android Studio v1.3 -- gradle.properties

升級玩出現:
Starting with version 1.3, Android Studio no longer Support IDE-specific Gradle JVM arguments.
Android Studio will remove any stored Grandle JVM arguments.
我的是..
Would you like to copy these JVM arguments:
-Dhttp.proxyHost=192.168.147.123 -Dhttp.proxyPort=3128
to the project's gradle.properties file?
選 Yes.
結果sync 一樣fail, 說 gradle 找不到 route

打開 gradle.properties 來看,多了:
org.gradle.jvmargs=-Dhttp.proxyHost\=192.168.147.123 -Dhttp.proxyPort\=3128
ref: https://docs.gradle.org/current/userguide/build_environment.html#N11961

改成:
systemProp.http.proxyHost=192.168.147.123
systemProp.http.proxyPort=3128
systemProp.https.proxyHost=192.168.147.123
systemProp.https.proxyPort=3128
就 OK了。

2015年8月3日 星期一

Old version Chrome.

因為某次更新後,chrome 內輸入中文都會出現最後一個字輸出兩次的情況,所以想安裝舊版本。

link 在: http://www.filehippo.com/download_google_chrome/history

現在 46.0.2467.2-1 沒問題。

2015年7月23日 星期四

android : run glibc linked elf file

使用 buildroot build 出自己的的 arm-linux-gcc 和 glibc

以 hello.c 來來測試:
buildroot$ ./output/host/usr/bin/arm-linux-readelf --program-headers hello

Elf file type is EXEC (Executable file)
Entry point 0x82c8
There are 8 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  EXIDX          0x000494 0x00008494 0x00008494 0x00008 0x00008 R   0x4
  PHDR           0x000034 0x00008034 0x00008034 0x00100 0x00100 R E 0x4
  INTERP         0x000134 0x00008134 0x00008134 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /lib/ld-linux.so.3]
  LOAD           0x000000 0x00008000 0x00008000 0x004a0 0x004a0 R E 0x8000
  LOAD           0x0004a0 0x000104a0 0x000104a0 0x0011c 0x00120 RW  0x8000
  DYNAMIC        0x0004ac 0x000104ac 0x000104ac 0x000e8 0x000e8 RW  0x4
  NOTE           0x000148 0x00008148 0x00008148 0x00020 0x00020 R   0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x4

 Section to Segment mapping:
  Segment Sections...
   00     .ARM.exidx 
   01     
   02     .interp 
   03     .interp .note.ABI-tag .hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .ARM.exidx .eh_frame 
   04     .init_array .fini_array .jcr .dynamic .got .data .bss 
   05     .dynamic 
   06     .note.ABI-tag 
   07     
要要 /lib/ld-linux.so.3
所以在 android 上鍵一個 /lib,再再把把 ld-linux.so.3 copy 過去...

然後出現:
error while loading shared libraries: libc.so.6: cannot open shared object file: No such file ro directory
所以 copy libc.so.6 到 /system/lib/
再執行就ok了,。


  • http://www.eoeandroid.com/thread-22046-1-1.html
  • http://thedevilking.blog.51cto.com/8144260/1364547
  • http://stackoverflow.com/questions/8610103/how-do-you-cross-compile-elf-executables-for-android
  • https://groups.google.com/forum/#!topic/android-internals/fHKKNkdPvAU

同時將 glibc 和 bionic 放到 android:

可以在 build toolchain 時,把 glibc 的 default path 改到 /lib
這樣 ld-linus.so 和 glibc 的 so 都會在 /lib

原本 android bionic 的 libc 會在 /systme/lib
就可以做出區別。

這樣的系統,用 toolchain build 出來的 elf, 可以在 android 系統上直接 run


附:

buildroot

build 出 buildroot 的 cross-tool 和 libc.
menuconfig:
Target options: 
-- Target Architecture : ARM(little endian)
-- Target Architecture Variant : (cortex-A9)
-- Floating point strategy : VFPv2
Toolchain:
-- kernel headers : Linux 3.0.x kernel header)
-- C library : glibc
-- Additional gcc options
[*] enable C++ support

先用 default: lastest stable & uclibc
build 完後,修改 hello program 的 envsetup.sh
把 toolchain 指向 buildroot/out/usr/bin/arm-linux-

uclibc 沒有實做 execinfo.h 的 backtrace.
還有 progma 問題。

改用 tag: 2013.11 結果也一樣。

所以改用 glibc
OK

build 完完會在 out

2015年7月8日 星期三

分析一下用的toolchain...

拿 mdnsreponder 來測試:
prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-gcc
prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-g++
prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-strip
用 gcc compile, 用 g++ link, 用 strip ...

deatails: Compile:
prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-gcc 
-I external/mdnsresponder/mDNSPosix 
-I external/mdnsresponder/mDNSCore 
-I external/mdnsresponder/mDNSShared 
-I external/mdnsresponder 
-I out/target/product/sugar-bpi/obj/EXECUTABLES/mdnsd_intermediates 
-I libnativehelper/include/nativehelper  
-isystem system/core/include 
-isystem hardware/libhardware/include 
-isystem hardware/libhardware_legacy/include 
-isystem hardware/ril/include 
-isystem libnativehelper/include 
-isystem frameworks/native/include 
-isystem frameworks/native/opengl/include 
-isystem frameworks/av/include 
-isystem frameworks/base/include 
-isystem frameworks/base/opengl/include 
-isystem external/skia/include 
-isystem out/target/product/sugar-bpi/obj/include 
-isystem bionic/libc/arch-arm/include 
-isystem bionic/libc/include 
-isystem bionic/libstdc++/include 
-isystem bionic/libc/kernel/common 
-isystem bionic/libc/kernel/arch-arm 
-isystem bionic/libm/include 
-isystem bionic/libm/include/arm 
-isystem bionic/libthread_db/include 
-c  -fno-exceptions -Wno-multichar -msoft-float -fpic 
-fPIE -ffunction-sections -fdata-sections -funwind-tables -fstack-protector 
-Wa,--noexecstack -Werror=format-security -D_FORTIFY_SOURCE=1 -fno-short-enums 
-march=armv7-a -mfloat-abi=softfp -mfpu=neon 
-include build/core/combo/include/arch/linux-arm/AndroidConfig.h 
-I build/core/combo/include/arch/linux-arm/ 
-Wno-unused-but-set-variable -fno-builtin-sin -fno-strict-volatile-bitfields -Wno-psabi 
-mthumb-interwork -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith 
-Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point 
-DNDEBUG -g -Wstrict-aliasing=2 -fgcse-after-reload -frerun-cse-after-loop -frename-registers 
-DNDEBUG -UDEBUG -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing  -O2 -g -W -Wall 
-D__ANDROID__ -D_GNU_SOURCE -DHAVE_IPV6 -DNOT_HAVE_SA_LEN -DUSES_NETLINK -DTARGET_OS_LINUX 
-fno-strict-aliasing -DHAVE_LINUX -DMDNS_DEBUGMSGS=0 
-DMDNS_UDS_SERVERPATH=\"/dev/socket/mdnsd\" 
-DMDNS_USERNAME=\"mdnsr\" -DPLATFORM_NO_RLIMIT     -MD 
-MF out/target/product/sugar-bpi/obj/EXECUTABLES/mdnsd_intermediates/mDNSPosix/PosixDaemon.d 
-o out/target/product/sugar-bpi/obj/EXECUTABLES/mdnsd_intermediates/mDNSPosix/PosixDaemon.o external/mdnsresponder/mDNSPosix/PosixDaemon.c

Link:
prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-g++ 
-nostdlib 
-Bdynamic 
-fPIE 
-pie 
-Wl,-dynamic-linker,/system/bin/linker 
-Wl,--gc-sections 
-Wl,-z,nocopyreloc 
-o out/target/product/sugar-bpi/obj/EXECUTABLES/mdnsd_intermediates/LINKED/mdnsd 
-Lout/target/product/sugar-bpi/obj/lib 
-Wl,-rpath-link=out/target/product/sugar-bpi/obj/lib 
-lc 
-lcutils  
out/target/product/sugar-bpi/obj/lib/crtbegin_dynamic.o         
out/target/product/sugar-bpi/obj/EXECUTABLES/mdnsd_intermediates/mDNSPosix/PosixDaemon.o 
out/target/product/sugar-bpi/obj/EXECUTABLES/mdnsd_intermediates/mDNSPosix/mDNSPosix.o 
out/target/product/sugar-bpi/obj/EXECUTABLES/mdnsd_intermediates/mDNSPosix/mDNSUNP.o 
out/target/product/sugar-bpi/obj/EXECUTABLES/mdnsd_intermediates/mDNSCore/mDNS.o 
out/target/product/sugar-bpi/obj/EXECUTABLES/mdnsd_intermediates/mDNSCore/DNSDigest.o 
out/target/product/sugar-bpi/obj/EXECUTABLES/mdnsd_intermediates/mDNSCore/uDNS.o 
out/target/product/sugar-bpi/obj/EXECUTABLES/mdnsd_intermediates/mDNSCore/DNSCommon.o 
out/target/product/sugar-bpi/obj/EXECUTABLES/mdnsd_intermediates/mDNSShared/uds_daemon.o 
out/target/product/sugar-bpi/obj/EXECUTABLES/mdnsd_intermediates/mDNSShared/mDNSDebug.o 
out/target/product/sugar-bpi/obj/EXECUTABLES/mdnsd_intermediates/mDNSShared/dnssd_ipc.o 
out/target/product/sugar-bpi/obj/EXECUTABLES/mdnsd_intermediates/mDNSShared/GenLinkedList.o 
out/target/product/sugar-bpi/obj/EXECUTABLES/mdnsd_intermediates/mDNSShared/PlatformCommon.o       
-Wl,--whole-archive   
-Wl,--no-whole-archive   
out/target/product/sugar-bpi/obj/STATIC_LIBRARIES/libcompiler-rt-extras_intermediates/libcompiler-rt-extras.a   
-Wl,-z,noexecstack 
-Wl,-z,relro 
-Wl,-z,now 
-Wl,--warn-shared-textrel 
-Wl,--icf=safe 
-Wl,--fix-cortex-a8   
-Wl,--no-undefined  
/home/charles-chang/hd/BPiA4.2.2/android/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/../lib/gcc/arm-linux-androideabi/4.6.x-google/armv7-a/libgcc.a 
out/target/product/sugar-bpi/obj/lib/crtend_android.o

另一個說明在 系統上放多個 share library 的方法。

2015年7月6日 星期一

XIGMATEK secure III, usb 3.0

[  249.332710] usb 4-3: new SuperSpeed USB device number 5 using xhci_hcd
[  249.349266] usb 4-3: New USB device found, idVendor=174c, idProduct=55aa
[  249.349273] usb 4-3: New USB device strings: Mfr=2, Product=3, SerialNumber=1
[  249.349276] usb 4-3: Product: ASMT1051
[  249.349279] usb 4-3: Manufacturer: asmedia
[  249.349281] usb 4-3: SerialNumber: 12345678A02E
[  249.349705] usb-storage 4-3:1.0: USB Mass Storage device detected
[  249.349875] usb-storage 4-3:1.0: Quirks match for vid 174c pid 55aa: 400000
[  249.349948] scsi9 : usb-storage 4-3:1.0
[  250.349417] scsi 9:0:0:0: Direct-Access     ASMT     2105             0    PQ: 0 ANSI: 6
[  250.350216] sd 9:0:0:0: Attached scsi generic sg5 type 0
[  250.351426] sd 9:0:0:0: [sde] 976773168 512-byte logical blocks: (500 GB/465 GiB)
[  250.351668] sd 9:0:0:0: [sde] Write Protect is off
[  250.351673] sd 9:0:0:0: [sde] Mode Sense: 43 00 00 00
[  250.351897] sd 9:0:0:0: [sde] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[  250.398727]  sde: sde1 sde2 < sde5 >
[  250.400395] sd 9:0:0:0: [sde] Attached SCSI disk

TEST

USB 2.0:
charles-chang@jessie431:~$ time -p bash -c "cp sd/test11 sd/test; sudo umount sd"
real 52.59
user 0.04
sys 3.22
charles-chang@jessie431:~$ sudo mount /dev/sde1 sd 
charles-chang@jessie431:~$ rm sd/test
charles-chang@jessie431:~$ time -p bash -c "cp sd/test11 sd/test; sudo umount sd"
real 53.93
user 0.02
sys 3.22
charles-chang@jessie431:~$ sudo mount /dev/sde1 sd 
charles-chang@jessie431:~$ rm sd/test
charles-chang@jessie431:~$ time -p bash -c "cp sd/test11 sd/test; sudo umount sd"
real 52.77
user 0.04
sys 3.19

USB 3.0:
charles-chang@jessie431:~$ time -p bash -c "cp sd/test11 sd/test; sudo umount sd"
real 17.81
user 0.02
sys 2.18
charles-chang@jessie431:~$ sudo mount /dev/sde1 sd 
charles-chang@jessie431:~$ rm sd/test
charles-chang@jessie431:~$ time -p bash -c "cp sd/test11 sd/test; sudo umount sd"
real 17.53
user 0.02
sys 2.14
charles-chang@jessie431:~$ sudo mount /dev/sde1 sd 
charles-chang@jessie431:~$ rm sd/test
charles-chang@jessie431:~$ time -p bash -c "cp sd/test11 sd/test; sudo umount sd"
real 17.64
user 0.00
sys 2.15

2015年7月3日 星期五

git Error : gnutls_handshake() failed: A TLS fatal alert has been received.

ubuntu 版本太舊了...
所以出現這個error.
本來以為是 git 版本太舊 (1.7.2),
所以去抓 source, 分別 build 了 1.9 和 2.0, 結果樣。
後來才看到是 library 的問題。

ref: http://askubuntu.com/questions/186847/error-gnutls-handshake-failed-when-connecting-to-https-servers

解決就是..
把 libcurl4-gnutls-dev換成 libcurl4-openssl-dev

然後重 build git 就可以。

2015年6月29日 星期一

nc : netcat 多功能 , 這次用來傳檔

ref: http://nakkaya.com/2009/04/15/using-netcat-for-file-transfers/

測試 usb ncm, 所以 adb 就不能用了,
host pc 和 android 用 ncm 連起來。

這時後要傳檔,android 上又沒有 ftp, ssh server.
就用最簡單的netcat.
Usage: nc [-iN] [-wN] [-l] [-p PORT] [-f FILE|IPADDR PORT] [-e PROG]

Open a pipe to IP:PORT or FILE

    -l      Listen mode
    -p PORT local port
    -w SEC  connect timeout
    -i SEC  delay interval for lines sent
    -f FILE use file (ala /dev/ttyS0) instead of network
    -e PROG Run PROG after connect

送和收都用 nc

先啟動收..
# nc -l -p 1234 > /system/bin/mytool

然後送的...
$ nc -w 3 192.168.200.2 1234 < ./mytool

2015年6月26日 星期五

UART 的開機訊息..
HELLO! BOOT0 is starting!
boot0 version : 3.0.0
dram size =1024
card boot number = 0
card no is 0
sdcard 0 line count 0
[mmc]: SD/MMC Card: 4bit, capacity: 15073MB
[mmc]: vendor: Man 0x001d4144 Snr 0xb247064d
[mmc]: product: SD
[mmc]: revision: 0.2
sdcard 0 init ok
The size of uboot is 0x000a4000.
sum=0x13f50087
src_sum=0x13f50087
Succeed in loading uboot from sdmmc flash.
Ready to disable icache.
Jump to secend Boot.
[      0.169]

U-Boot 2011.09-rc1-00003-ge89ab14-dirty (Jan 03 2014 - 12:57:33) Allwinner Technology

好像是..
cpu load boot0.
boot0 init sdmmc, 然後 load boot1

boot1 再把 u-boot load 進來。

這 code 好像是在..
lichee/boot
下面剛好有..boot0. boot1, config..這些folder.

--

2015年6月22日 星期一

Banana Pi, android image test

ref: http://www.botsheet.com/cht/banana-pi-install-android-4-2/
是 4.2 版。

主要是使用 PhinexCard 燒錄工具有點不直覺。
而且要分城幾部份..

write Mode 選 Startup.
然後 Format to Norma.
再 Burn

開機,接 HDMI 就可以,但是..接在 monitor 上,monitor 顯示 Signal Out of Range.
所以只好接在 1080P 的 display 上。

開機,接在 CON上的 tty pin會顯示 boot log..到 ..
還是沒有出現 shell prompt..

Wifi 使用上次 raspberry pi 做 miracast 的 dongle 就可以正常動作。
adb 也可以正常動作。

2015年6月17日 星期三

Banana Pi.

google 了一下,好像是這樣:

台灣人'想要' 學 raspberry pi 做一個 open hardware.
可能應繼架構和名稱都設計好了,然後請 大陸人代工。
硬體找人代工,軟體也是,找了另一個大陸公司代工。

因為軟體是找人代工的,support 也就一樣是那個人負責囉。
然後...

東西好像熱起來,台灣人有點高興。
大陸人可能覺得support 做這麼久,community. 也是我搞起來的。
所以就去註冊了 banana pi 商標。

這下台灣人不開心,可能有威脅說要怎樣怎樣,
但是, 裁判,球證都是我的人,你能拿我怎樣!
阿,不對, hardware, software 都是我做的,你有什麼?

所以鬧了一陣子,大陸人也改了名字。
台灣這邊才警覺到,自己要 mantain software 和 community, 所以開始設forum, github...


所以..
有關 bananpi 的 資源很亂。

有allwiner 原廠的,
有 lemaker 的,
也有 bananapi org 的。

2015年6月12日 星期五

A20 android build from source

其實就是 build_android.sh 這個 script.

一樣...
. build/envsetup.sh
lunch  # 選 sugar-bpi 或是 sugar-lemark
然後多一個步驟:
extract-bsp

最後才 make

make 完做 pack

這個特殊command, ref: http://www.cnblogs.com/JonnyLulu/p/3572080.html
是在 android/device/sofrwinner/common/vendorsetup.sh

裡面還有一堆 command.


因為在 envsetup 時..
including device/asus/grouper/vendorsetup.sh
including device/asus/tilapia/vendorsetup.sh
including device/generic/armv7-a-neon/vendorsetup.sh
including device/generic/armv7-a/vendorsetup.sh
including device/generic/mips/vendorsetup.sh
including device/generic/x86/vendorsetup.sh
including device/samsung/maguro/vendorsetup.sh
including device/samsung/manta/vendorsetup.sh
including device/samsung/toroplus/vendorsetup.sh
including device/samsung/toro/vendorsetup.sh
including device/softwinner/common/vendorsetup.sh
including device/softwinner/sugar-bpi/vendorsetup.sh
including device/softwinner/sugar-evb/vendorsetup.sh
including device/softwinner/sugar-lemaker/vendorsetup.sh
including device/softwinner/sugar-ref001/vendorsetup.sh
including device/softwinner/sugar-standard/vendorsetup.sh
including device/softwinner/wing-evb-v10/vendorsetup.sh
including device/ti/panda/vendorsetup.sh
including sdk/bash_completion/adb.bash
所以vendorsetup.sh 會被包含進入。
所以可以寫自己的擴充 command 到 vendorsetup.sh 中。

2015年6月9日 星期二

shflags -- another way to getopt in shell script

這原來\是google code.
用簡單的定義 DEFINE_xxx 方式來方便 shell script 做 argument 設定,取得
使用時,只要在 script 前
. ./shflags
之後就可以用 shflags 裡面所有的 function 變數。

原網站有說明和 example.

這裡就大概寫一些。以望站上的 example來看。
#!/bin/sh

. /path/to/shflags

#define option variable: var_name, default_value, var_comment, var_option_flag
DEFINE_string 'name' 'world' 'name to say hello' 'n'

#processing the arguments
FLAGS "$@" || exit $?
eval set -- "{$FLAGS_ARGV}"

# say hello
echo "Hello, ${FLAGS_name}" !

就像 comment 說的 一樣。
使用和輸出結果是..
./hello_world.sh -n charles
Hello charles !

A20 , kernel (android?) build from source

先看 build_kernel.sh:

default config 是 bpi_defconfig 或 sun7i_bpi_android_defconfig
內容很無聊,就 make clean,然後到 lichee 下 run build.sh

lichee/build.sh:

buidroot/scripts/mkcommon.sh $@

所以 mkcommon.sh:

好像是真正的 master build script

整理一下:

scripts/build_kernel.sh
lichee/build.sh -p sun7i_android
lichee/buildroot/scripts/mkcommon.sh $@

所以其實只有到 lichee 下, run buildroot/scripts/mkcommon.sh -p sun7i_android

用了一個 google code: shflags.
這是用來使用 argument 的。

以下面這行為例:
DEFINE_string 'platform' 'sun7i' 'platform to build, e.g. sun7i' 'p'
意思是:argument 中有 -n 選項,是 platform 變數,default value 是 sun7i, 說明是 "platform to build, e.g. sun7i

所有的 build script 選項:
DEFINE_string 'platform' 'sun7i' 'platform to build, e.g. sun7i' 'p'
DEFINE_string 'kernel' '3.4' 'kernel to build, e.g. 3.3' 'k'
DEFINE_string 'board' '' 'board to build, e.g. evb' 'b'
DEFINE_string 'module' '' 'module to build, e.g. buildroot, kernel, uboot, clean' 'm'
DEFINE_boolean 'independent' false 'output build to independent directory' 'i'

回到 script, 只有一個 option: '-p sun7i_android'
所以:
FLAGS_platform = sun7i_android
FLAGS_kernel = 3.4 
FLAGS_board = 
FLAGS_module =
FLAGS_independent = false 

接著看..
然後利用字串處理符號 (ref: http://tldp.org/LDP/abs/html/string-manipulation.html ) :

chip=${FLAGS_platform%%_*}       切掉 _以後的部份
platform=${FLAGS_platform##*_}   取出 _之前的部份
kernel=${FLAGS_kernel}
board=${FLAGS_board}
module=${FLAGS_module}
所以..
chip = sun7i
platform = android
kernel = 3.4
board =
module -

所以是 run :
init_outdir
mklichee

build kernel..
結果出現 error:
make: Entering directory `/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali'
/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4
make -C DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump CONFIG=ca8-virtex820-m400-1 BUILD=release KDIR=/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4
make[1]: Entering directory `/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump'
make -C /home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4 M=/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump modules
make[2]: Entering directory `/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4'
  CC [M]  /home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump/common/ump_kernel_common.o
arm-linux-gnueabi-gcc: error: directory: No such file or directory
arm-linux-gnueabi-gcc: error: directory": No such file or directory
make[3]: *** [/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump/common/ump_kernel_common.o] Error 1
make[2]: *** [_module_/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump] Error 2
make[2]: Leaving directory `/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump'
make: *** [build] Error 2
make: Leaving directory `/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali'

因為 kernel build 減少了 message 輸出,所以不知道那裡出問題。
先把 message 打開...
ref: https://www.kernel.org/doc/readme/README
- Verbose kernel compile/build output:

   Normally, the kernel build system runs in a fairly quiet mode (but not
   totally silent).  However, sometimes you or other kernel developers need
   to see compile, link, or other commands exactly as they are executed.
   For this, use "verbose" build mode.  This is done by inserting
   "V=1" in the "make" command.  E.g.:

     make V=1 all

   To have the build system also tell the reason for the rebuild of each
   target, use "V=2".  The default is "V=0".

就是去把 compile 加上 option "V=1".

這個build module 的script 是...
 lichee/linux-3.4/scripts/build_sun7i_android.sh 
所以在 mali 加上 V=1

diff --git a/lichee/linux-3.4/scripts/build_sun7i_android.sh b/lichee/linux-3.4/scripts/build_sun7i_android.sh
index 1c0eae2..45beab3 100755
--- a/lichee/linux-3.4/scripts/build_sun7i_android.sh
+++ b/lichee/linux-3.4/scripts/build_sun7i_android.sh
@@ -135,7 +135,7 @@ build_modules()
     (
     export LANG=en_US.UTF-8
     unset LANGUAGE
-    make -C modules/mali LICHEE_MOD_DIR=${LICHEE_MOD_DIR} LICHEE_KDIR=${LICHEE_KDIR} \
+    make -C modules/mali LICHEE_MOD_DIR=${LICHEE_MOD_DIR} LICHEE_KDIR=${LICHEE_KDIR} V=1 \
         install
     )
 
build 的結果是..
make: Entering directory `/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali'
/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4
make -C DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump CONFIG=ca8-virtex820-m400-1 BUILD=release KDIR=/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4
make[1]: Entering directory `/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump'
make -C /home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4 M=/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump modules
make[2]: Entering directory `/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4'
test -e include/generated/autoconf.h -a -e include/config/auto.conf || (  \
 echo;        \
 echo "  ERROR: Kernel configuration is invalid.";  \
 echo "         include/generated/autoconf.h or include/config/auto.conf are missing.";\
 echo "         Run 'make oldconfig && make prepare' on kernel src to fix it."; \
 echo;        \
 /bin/false)
mkdir -p /home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump/.tmp_versions ; 
rm -f /home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump/.tmp_versions/*
make -f scripts/Makefile.build obj=/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump
  arm-linux-gnueabi-gcc -Wp,-MD,
  /home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump/common/.ump_kernel_common.o.d  
  -nostdinc -isystem /home/charles-chang/sd/BPiA4.2.2/lichee/out/android/common/buildroot/external-toolchain/bin/../lib/gcc/arm-linux-gnueabi/4.6.3/include
  -I/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/arch/arm/include
  -Iarch/arm/include/generated -Iinclude  
  -include /home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/include/linux/kconfig.h 
  -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-sun7i/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing 
  -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -Os -marm -fno-dwarf2-cfi-asm 
  -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=7 -march=armv7-a 
  -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls 
  -g -femit-struct-debug-baseonly -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack 
  -DSVN_REV=Unversioned directory -DSVN_REV_STRING=\"Unversioned directory\" 
  -I/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump
  -I/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump/common
  -I/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump/linux 
  -I/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump/../mali/common
  -I/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump/../mali/linux
  -I/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump/../../ump/include/ump
  -DMALI_STATE_TRACKING=0 -I/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump/linux/license/gpl
  -DMODULE  -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(ump_kernel_common)"  -D"KBUILD_MODNAME=KBUILD_STR(ump)" -c
  -o /home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump/common/.tmp_ump_kernel_common.o
  /home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump/common/ump_kernel_common.c

arm-linux-gnueabi-gcc: error: directory: No such file or directory
arm-linux-gnueabi-gcc: error: directory": No such file or directory
make[3]: *** [/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump/common/ump_kernel_common.o] Error 1
make[2]: *** [_module_/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump] Error 2
make[2]: Leaving directory `/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali/DX910-SW-99002-r3p2-01rel2/driver/src/devicedrv/ump'
make: *** [build] Error 2
make: Leaving directory `/home/charles-chang/sd/BPiA4.2.2/lichee/linux-3.4/modules/mali'

所以問題就出在..
-DSVN_REV=Unversioned directory 
其中 Unversioned directory 沒有用 " " 刮起來,directory 被認為是 compile object...

ref: https://github.com/Pivosgroup/buildroot-linux-kernel/commit/1524a2dc8bfbee683384996f434a2a991416c1df
這裡有一樣的問題。
說明這個 SVN_REV 是用 svnversion 輸出的 svn 版本。
如果這個 folder 不是 svn control, svnversion 就會顯示 exported.
SVN_REV := $(shell ((svnversion | grep -qv exported && echo -n 'Revision: ' && svnversion) || git svn info | sed -e 's/$$$$/M/' | grep '^Revision: ' || echo ${MALI_RELEASE_NAME}) 2>/dev/null | sed -e 's/^Revision: //')
其中的..
svnversion | grep -qv exported 
其中的 grep -qv exported 就是剔除 包含 "exported" 的 pattern.
本意是剔除沒有 svn control 的 folder, 因為svnversion 會顯示 "exported".

但是 svn 在1.7 版以後,改為顯示 "Unversioned directory".
所以上面的 rule 就 fail.
要改成:
svnversion | grep -Eqv "exported|Unversioned directory"
同時剔除 exported 和 Unversioned directory 才行。

2015年6月8日 星期一

Chromebook

chrome book..
開始服役。

因為是特價,所以鍵盤沒有注音。
也還好。

有關 touchpad:
  • 三指滑動可以切換分頁
  • 三指往下滑動可以開啟多視窗切換
  • 雙擊後可以輕觸拖曳視窗(要先手動到 Chrome OS 設定中調整)
  • 雙指拖曳可以捲動頁面
  • 雙指輕點是滑鼠右鍵
有關 keyboard:
  • alt+down : next page/ page down
  • alt+up : prev page/ page up

2015年5月26日 星期二

wifi on banana pi -- TP-LINK TL-WN725N

banana pi 的 kernel 有內建這個 module driver.
所以插入後,lsusb (package: usbutil):
Bus 002 Device 002: ID 0bda:8179 Realtek Semiconductor Corp.
...

lsmod 的話:
Module  Size   Used by
8188eu  506733 0

這時候,用 ifconfig -a 來看,已經可以看到 wlan0 這個 interface. 只是還沒啟動。
所以 follow : http://www.fars-robotics.net/ 其中,不用 wpa_supplicant (package: wpasupplicant) 的方法。
修改 /etc/network/interfaces:
auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid "Your-Network-Name"
wpa-psk "Your-Network-Password"
然後,用command: ifup wlan0...
就可以看到 wlan0 起來了 .. 拿到 ip 了。


補一下http://www.fars-robots.net 中,用 wpa_supplicant 的作法:
-- copy..

Configuring your wifi network for Raspbian Jessie.

Default /etc/network/interfaces file as supplied in the raspbian jessie image - do not edit /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

iface eth0 inet manual

allow-hotplug wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

allow-hotplug wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
Edit the file /etc/wpa_supplicant/wpa_supplicant.conf and add the network={.....} section. Use the command sudo nano /etc/wpa_supplicant/wpa_supplicant.conf to open and edit the file. Exit the editor and save the file using keys cntl-X, Y, Enter.
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="Your-Network-Name"
    psk="Your-Network-Password"
}
You may add additional network={.....} sections defining different networks if your Pi is mobile and you carry it around with you. This will allow you to connect to these other networks at various different locations without needing to change your set up.

2015年5月25日 星期一

build image for nexus 7.

就是 follow 這一頁:https://source.android.com/source/index.html

實際的 instruction 是 從這裡(https://source.android.com/source/building.html) 開始。

download source code 開始..
$ repo init -u https://android.googlesource.com/platform/manifest -b android-5.1.1_r1

-- branch 是參考:https://source.android.com/source/build-numbers.html#source-code-tags-and-builds
-- device codename 是參考: http://forum.xda-developers.com/wiki/Google/Device_Codenames

然後,要重新指定 java7..(因為我是用 java6).
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/

然後就是..參考: https://source.android.com/source/building-running.html
我選 10:

就開始 build 了...
-- 好奇怪,nexus 7 好像沒有proprietry binary,所以直接build 就可以。

2015年5月21日 星期四

build image for banana pi

就 follow wiki.. http://wiki.lemaker.org/Building_u-boot,_script.bin_and_linux-kernel
- 換位置了:(http://wiki.lemaker.org/BananaPro/Pi:Building_u-boot,_script.bin_and_linux-kernel)
這是在 x86 pc 上做的,不是在 banana pi 上。
-- 我在 pi 上做,發現make script 直接寫死 toolchain 名子,所以找不到。
做完config 後,出現訊息叫你 make, 就 make了。

結果會放在 build 目錄。
build 目錄好像是所有 project, subproject 的 output 目錄,
kernel, uboot, tools, boot script 都output 在這裡。

然後就 follow link 到 .. http://wiki.lemaker.org/Setting_up_the_bootable_SD_card
- 換位置了。(http://wiki.lemaker.org/BananaPro/Pi:Setting_up_the_bootable_SD_card)

大慨是為了模擬 raspberry pi ,所以把sd card 分成兩個partition:
  • 1 : FAT : 放 kernel, uboot command.
  • 2 : EXT4, rootfs

但是和 raspberry pi 不一樣,raspberry pi 因為 gpu 有讀取 vfat 能力,所以用 gpu 做 bootloader.
因次 uboot, kernel 都被放在 fat partition.

banana pi 內部的 bootloader 不認識 filesystem,
所以還是要把 uboot + spl 放到某個 sector (1024x8). 讓 A20 bootrom 去 load.
然後 uboot 再到 第一個 partition 去 loader kernel


所以第一個 partition 就是做這些 boot script 和 copy kernel.

第二個 partition 就是 root, 所以利用 debootstrap 來做。
因為用 wget 來抓檔,所以在 proxy 後面的時候,要另外指定。

修改 /etc/wgetrc
把 http_proxy 和 https_proxy 打開。
就可以看到抓 package 的 log..

follow intruction 都做玩,開機。沒有 network, eth0 沒有 config.
所以修改 /etc/network/interfaces: 加上:
auto eth0
iface eth0 inet dhcp

之後,在用 ifup eth0.. 就出現了。

然後啟動 ssh server:
services ssh start
因為 ssh 不允許 root login. 所以要 add 一個 user pi/raspberry
這樣,就可以用 pi ssh 進來。

2015年5月19日 星期二

ntp server

ntp server 是一個階層式的設計。
每一個 ntp server 都會說明他的時間的 "源頭".
源頭可以是 GPS, 原子鐘等硬體。
也可以是另一台 ntp server.

根據時間的取得來源,代表ntp server 的時間是第一手(直接的硬體 GPS, 原子中..),
或是第二手 (令一個 ntp server).
ntp server 有一個參數叫 stratum
stratum = 1 就是第一手。
2 就是第二手。



在 ntp.conf 裡。
要設定 時間的 "源頭"..
一般都是設定 "上一手" 的 ntp server.
所以就是用 server 列出:
server 0.debian.pool.ntp.org iburst
server 1.debian.pool.ntp.org iburst
server 2.debian.pool.ntp.org iburst
server 3.debian.pool.ntp.org iburst
這個範例列出他的上游 ntp server 有四個。
ntp daemon 會自動找出最適合的 server 來同步。

另外,如果要使用自己的hw clock, 就要用:
server 127.127.1.0
說明跟自己拿時間。
又因為這樣就沒有說明是第幾手,所以要加令一個command:
fudge 127.127.1.0 stratum 10
說明自己hw color 是第 10 手。

ntp daemon 基本上會去一一詢問這些 server, 然後決定使用那一個 server 的資料。
同時詢問 server 的 stratum (第幾手) number.
好決定自己的 stratum number.

像上游stratum 是 2, 自己就是 3.


ntp.conf 設好以後, service ntp restart 就可以重新啟動 ntp server
ntp server package 提供一個 tool 來看 ntp server 資料。

$ ntpq -pn
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 91.189.89.199   .STEP.          16 u    - 1024    0    0.000    0.000   0.000
*192.168.144.248 59.124.29.241    3 u   16   64  377    0.115   48.283  12.243
 127.127.1.0     .LOCL.          10 l    4   64  377    0.000    0.000   0.001

-p 是 peer
-n 是 show ip address.

可以看到 remote 列出在 ntp.conf 中 server 的列表。
refid 是他的上游 ntp server.
所以 .LOCAL. 就是自己的 hw clock.
.STEP 好像是 sync fail

st 是 stratum ,可以看到 sync fail 的, stratum 是 16

第二個 server 前面有一個 * 符號。
代表 ntp server 決定使用這一個 server 的資料。-- (所以自己的 stratum 就是 4)

當 ntp service 剛剛啟動,* 不會出現,大約需要 5 ~ 10 min 才會決定。
當有 * 出現時, ntp server 才會正常回應 ntp client 的 要求。


測試

可以用 ntpdate 來測試。
$ ntpdate -q 127.0.0.1
server 127.0.0.1, stratum 4, offset -0.000003, delay 0.02562
19 May 17:45:59 ntpdate[4599]: adjust time server 127.0.0.1 offset -0.000003 sec
問自己..

要是出問題,可以用 -dv 列出debug information


ref:
  • http://markelov.org/wiki/index.php/NTP._Server_dropped:_strata_too_high
  • http://docs.oracle.com/cd/E26996_01/E18548/html/manager_ntpconfig.html
  • http://en.linuxreviews.org/NTP_-_Howto_make_the_clock_show_the_correct_time
  • http://www.geego.com.tw/technical-discussion-forum/tech-tips-centos-ntp-server-%E6%9E%B6%E8%A8%AD%E5%BF%83%E5%BE%97

client

client 只要安裝 ntpdate .
他同時會修改 /etc/network/if-up.d/ntpdate
這樣在network up 時,會自動執行 ntpdate 更改時間。

ntp server.. sync to hw clock

只是想讓一些像 raspberry pi, banana pi 這樣沒有 RTC 的板子在每次斷電開機後,可以有正常的時間。
(這樣做 file operation, make 等才不會有 complain).

所以想在 lan 中放一個 ntp server.
因為很倒楣的是,firewall 屏蔽掉 ntp udp port。
所以只能以某台server 的 hw clock 作為 ntp server 的同步時間。

server:

就莊 ntp 就可以。
然後修改 /etc/ntp.conf

因為會被 blocking, 所以 sync 的 ntp server 隨便寫。
但是要使用自己的 hwclock 作為 sync time,
就要加上:
server 127.127.1.0
fudge 127.127.1.0 stratum 9
server 127.127.1.0 說明自己也是 time server.
其中的 fudge 說明自己是 stratum 9.
這樣,自己的 hw clock 就會是一個stratum (位階) 9 的 ntp server.

ntp.conf 的修改,基本上不需要動。
只有 server list 要調整。
因為已經有各 distribution 基本的 server list, 所以不用動也可以。

在local lan 因為 firewall 擋住,所以所有的 ntp server 都無法 sync..
所以只會sync 到 LOCAL.



ref:
  • http://www.satsignal.eu/ntp/Raspberry-Pi-NTP.html
  • http://en.linuxreviews.org/NTP_-_Howto_make_the_clock_show_the_correct_time#What_the_fudge.3F

2015年5月18日 星期一

banana pi..

網路上買banana pi, 很便宜,只要 800

然後要download image.. 發現...http://www.bananapi.com/index.php/download
有四種,在 http://www.bananapi.com/index.php 有說明。
所以應該是 M1, 這款 connector 位置都跟 raspberry pi 一樣。

結果 download 了 rasbian image,dd 完啟動直接進 X...

所以,一樣,先改 apt proxy, 然後 update, upgrade.
--- 會出現 out of space...
.. 但是這次 mirrordirector 竟然沒有上次的問題.

重新 dd, 先做 raspi-config 看看..

ctrl-alt-F1.. 先switch 到 console mode 看看..
-- F7 是 GUI

切到 console, sudo raspi-config
把 space expand..,
重開機,
df 看一下是不是已經 expane.

修改 apt.conf.d 加上 02proxy
apt-get update, upgrade..

發現 config 成 boot to consol 後,reboot. upgrade, 再進 desktop mode 後 fail
畫面跳動。



原來有一個較 banania 的 os image..
一樣,dd 後開機。
開機進 console.
login : root
passowrd: pi
之後 run : banana-config
採用問答式,跟 raspi-config 類似。

然後修改 apt proxy, 再依照說明 run banana-update. 出現 fail, 好像不吃 proxy.
只好手動..apt-get update

連 sudo 都沒有,所以 apt-get install sudo

create new user..pi/raspberry. 把他加入 sudo group

可以用 pi/raspberry login 了。sudo 也 OK

2015年5月7日 星期四

mDNSResponder test..

要 bison. flex.
完成後,先啟動 daemon : mdnsd
然後隨便 run 一個 client app:
pi@raspberrypi ~/mDNSResponder-544/mDNSPosix/build/prod $ ./mDNSClientPosix 
socket AF_INET6: Address family not supported by protocol
mDNSClientPosix: Finished with status -65537, result 2


所以要 enable ipv6, 不然就要修改 Makefile, 把 ipv6 disable掉

ref: https://www.raspbian.org/RaspbianFAQ#How_do_I_enable_or_use_IPv6.3F
就 sudo modprobe ipv6

再 run mdnsd 和,,
pi@raspberrypi ~/mDNSResponder-544/mDNSPosix/build/prod $ ./mDNSClientPosix 
Hit ^C when you're bored waiting for responses.

... 不一樣了...

在 jessie 下 build, error:
../mDNSShared/dnsextd_parser.y:188:22: note: each undeclared identifier is reported only once for each function it appears in
../mDNSShared/dnsextd_parser.y: In function ‘ParseConfig’:
../mDNSShared/dnsextd_parser.y:448:8: error: too many arguments to function ‘yyparse’
  err = yyparse( ( void* ) d );
        ^
objects/prod/dnsextd_parser.c:1125:1: note: declared here
 yyparse (void)
 ^
make: *** [objects/prod/dnsextd_parser.y.o] Error 1
.. 這個先跳過...

ref: https://github.com/changyy/mDNSResponder-cmake

原來是這樣用的...mDNSResponderPosix 和 mDNSClientPosix

Makefile 這兩個 ap 的 source:
SPECIALOBJ = $(OBJDIR)/mDNSPosix.c.o $(OBJDIR)/mDNSUNP.c.o $(OBJDIR)/mDNSDebug.c.o $(OBJDIR)/GenLinkedList.c.o \
        $(OBJDIR)/DNSDigest.c.o $(OBJDIR)/uDNS.c.o $(OBJDIR)/DNSCommon.c.o $(OBJDIR)/PlatformCommon.c.o \
        $(OBJDIR)/CryptoAlg.c.o $(OBJDIR)/anonymous.c.o
COMMONOBJ  = $(SPECIALOBJ) $(OBJDIR)/mDNS.c.o
APPOBJ     = $(COMMONOBJ) $(OBJDIR)/ExampleClientApp.c.o

$(BUILDDIR)/mDNSClientPosix:         $(APPOBJ)     $(OBJDIR)/Client.c.o
        $(CC) $+ -o $@ $(LINKOPTS)

$(BUILDDIR)/mDNSResponderPosix:      $(COMMONOBJ)  $(OBJDIR)/Responder.c.o
        $(CC) $+ -o $@ $(LINKOPTS)



follow ref 的作法,看看 option :
$ ./mDNSResponderPosix -h
./mDNSResponderPosix: invalid option -- 'h'
Usage: mDNSResponderPosix [-v level ] [-r] [-n name] [-t type] [-d domain] [-p port] [-f file] [-b] [-P pidfile] [-x name=val ...]
          -v verbose mode, level is a number from 0 to 2
             0 = no debugging info (default)
             1 = standard debugging info
             2 = intense debugging info
             can be cycled kill -USR1
          -r also bind to port 53 (port 5353 is always bound)
          -n uses 'name' as the service name (required)
          -t uses 'type' as the service type (default is '_afpovertcp._tcp.')
          -d uses 'domain' as the service domain (default is 'local.')
          -p uses 'port' as the port number (default is '548')
          -f reads a service list from 'file'
          -b forces daemon (background) mode
          -P uses 'pidfile' as the PID file
             (default is '/var/run/mDNSResponder.pid')
             only meaningful if -b also specified
          -x stores name=val in TXT record (default is empty).
             MUST be the last command-line argument;
             all subsequent arguments after -x are treated as name=val pairs.
和..
$ ./mDNSClientPosix -h
./mDNSClientPosix: invalid option -- 'h'
Usage: mDNSClientPosix [-v level] [-t type] [-d domain]
          -v verbose mode, level is a number from 0 to 2
             0 = no debugging info (default)
             1 = standard debugging info
             2 = intense debugging info
          -t uses 'type' as the service type (default is '_afpovertcp._tcp')
          -d uses 'domain' as the domain to browse (default is 'local.')

所以最簡單的就是:
$ ./mDNSResponder -n mytest
因為沒有加上 -b, 所以要用另一台機器(在同一個 lan)..
$ ./mDNSClientPosix 
Hit ^C when you're bored waiting for responses.
*** Found name = 'mytest', type = '_afpovertcp._tcp.', domain = 'local.'
完成。


****
Debian Jessie 真的不能build...@_@.. 拿部份build成功的 mDNSResponder 來 run, 會出現 Address in use error

實際測試是用 raspberry pi 和 ubuntu 12.10 接在 LAN 上測試成功。

-- 都 disable IPV6.
另外, Bananapi + Android 4.2 和 raspberry pi + raspbian 用 NCM (Usb) 連線測試也 OK
Bananapi + Android 4.2 用的是 Android 內建的..mdnsresponder..
修改 Android.mk:
include $(CLEAR_VARS)

LOCAL_SRC_FILES := mDNSPosix/mDNSPosix.c \
                  mDNSPosix/mDNSUNP.c \
                  mDNSShared/mDNSDebug.c \
                  mDNSShared/GenLinkedList.c \
                  mDNSCore/DNSDigest.c \
                  mDNSCore/uDNS.c \
                  mDNSCore/DNSCommon.c \
                  mDNSShared/PlatformCommon.c \
                  mDNSCore/mDNS.c \
                  mDNSPosix/ExampleClientApp.c \
                  mDNSPosix/Client.c \

LOCAL_MODULE := mDNSClientPosix
LOCAL_MODULE_TAGS := optional

LOCAL_C_INCLUDES := external/mdnsresponder/mDNSPosix \
                    external/mdnsresponder/mDNSCore  \
                    external/mdnsresponder/mDNSShared

LOCAL_CFLAGS := -O2 -g -W -Wall -D__ANDROID__ -D_GNU_SOURCE -DNOT_HAVE_SA_LEN -DUSES_NETLINK -DTARGET_OS_LINUX -fno-strict-aliasing -DHAVE_LINUX -DMDNS_DEBUGMSGS=0 -DMDNS_UDS_SERVERPATH=\"/dev/socket/mdnsd\" -DMDNS_USERNAME=\"mdnsr\" -DPLATFORM_NO_RLIMIT

LOCAL_SYSTEM_SHARED_LIBRARIES := libc libcutils

include $(BUILD_EXECUTABLE)

twitter client in console mode : rainbowstream

http://www.rainbowstream.org/

是用 python 寫的。
就 follow doc 說明。用virtualenv 建立一個工作環境,在用 pip 裝。以後就可以在這個工作還行 run.

要注意的是,有關 proxy.
他會吃環境變數 http_proxy, 但是又不會動。然後 --proxy command 又會受影響。

所以要先把 http_proxy unset, 再用 --proxy option 來 run.

第一次run 會叫出 browser login twitter, 給 rainbowstream 授權。


source venv/bin/activate
unset http_proxy
unset https_proxy
rainbowstream -ph 192.168.0.1 -pp 3128 -pt HTTP



大概說明一下...
virtualenv 是 python 的一個 tool, 會幫你建立一個虛擬環境,在這個環境裡,你可以安裝軟體,設定環境變數..etc
都不會動到主系統。
而且退出後就消失。 virtualenv venv 的命令就是:建立一個 virtualenv 環境,名稱叫 venv.
之後,在home 目錄下就會有 venv 這個目錄。

要進入venv 這個環境,只要:
source venv/bin/activate
就可以。

2015年5月6日 星期三

raspberry pi, apt-get update slow

很奇怪,超慢,竟然要 17hr...

所以 follow : http://allaboutraspberrypi.blogspot.tw/2014/12/slow-apt-get-on-raspberry-pi.html

參考: http://www.raspbian.org/RaspbianMirrors

#deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi
deb http://free.nchc.org.tw/raspbian/raspbian/ wheezy main contrib non-free rpi

這樣就OK 了。

2015年5月5日 星期二

prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gcc  
-I external/strace/strace/linux/sh   
-I bionic/libc/kernel/common   
-I bionic/libc/kernel/arch-arm   
-I external/strace/linux   
-I external/strace/android/arch/arm   
-I external/strace   
-I out/target/product/sirfsocv7/obj/EXECUTABLES/strace_intermediates   
-I dalvik/libnativehelper/include/nativehelper   
-I system/core/include   
-I hardware/libhardware/include   
-I hardware/libhardware_legacy/include   
-I hardware/ril/include   
-I dalvik/libnativehelper/include   
-I frameworks/base/include   
-I frameworks/base/opengl/include   
-I frameworks/base/native/include   
-I external/skia/include   
-I out/target/product/sirfsocv7/obj/include   
-I bionic/libc/arch-arm/include   
-I bionic/libc/include   
-I bionic/libstdc++/include   
-I bionic/libc/kernel/common   
-I bionic/libc/kernel/arch-arm   
-I bionic/libm/include   
-I bionic/libm/include/arch/arm   
-I bionic/libthread_db/include  
-c  -fno-exceptions -Wno-multichar -msoft-float -fpic -ffunction-sections -funwind-tables -fstack-protector 
-Wa,--noexecstack 
-Werror=format-security -fno-short-enums 
-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 
-include system/core/include/arch/linux-arm/AndroidConfig.h 
-I system/core/include/arch/linux-arm/ 
-Wno-psabi -mthumb-interwork 
-DANDROID -fmessage-length=0 
-W -Wall -Wno-unused -Winit-self 
-Wpointer-arith -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point 
-DNDEBUG -g -Wstrict-aliasing=2 
-finline-functions -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop 
-frename-registers 
-DNDEBUG -UDEBUG 
-mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64  
-DHAVE_CONFIG_H -Dd_fileno=d_ino -D_LFS64_LARGEFILE=1     
-MD 
-o out/target/product/sirfsocv7/obj/EXECUTABLES/strace_intermediates/sock.o external/strace/sock.c
CLIENTLIBOBJS = $(OBJDIR)/dnssd_clientlib.c.so.o $(OBJDIR)/dnssd_clientstub.c.so.o $(OBJDIR)/dnssd_ipc.c.so.o

$(BUILDDIR)/libdns_sd.$(LDSUFFIX): $(CLIENTLIBOBJS)
        $(LD) -shared $(LINKOPTS) -o $@ $+
        $(STRIP) $@
dnssd_clientstub.c :

Android:

system/netd/MDnsSdListener.cpp

2015年4月24日 星期五

mdnsresponder, android 2.3.7

build error:
target thumb C: mdnsd <= external/mdnsresponder/mDNSPosix/mDNSUNP.c
external/mdnsresponder/mDNSPosix/mDNSUNP.c: In function 'recvfrom_flags':
external/mdnsresponder/mDNSPosix/mDNSUNP.c:649: error: dereferencing pointer to incomplete type
external/mdnsresponder/mDNSPosix/mDNSUNP.c:653: error: dereferencing pointer to incomplete type
line:649 是
            sin6->sin6_addr     = ip6_info->ipi6_addr;
lin: 653 是
            pktp->ipi_ifindex   = ip6_info->ipi6_ifindex;
所以猜是 ip6_info 沒宣告。
查一下:
            struct in6_pktinfo *ip6_info = (struct in6_pktinfo*)CMSG_DATA(cmptr);
找一下有沒有struct in6_pktinfo:
  • bionic : 沒有
  • kernel : include/linux/ipv6.h
  • jelly bead bionic : libc/kernel/common/linux/ipv6.h
所以是 2.3.7 的 bionic 沒有放進來。
所以,直接把 jelly bean 的 ipv6.h copy 過來。
然後找 jelly-bean 的 header 哪裡有 include ipv6.h
libc/include/netinet/in.h
所以照著修改 ...

rebuild mdnsresponder...OK

2015年4月22日 星期三

bionic 的 libc/kernel/common/linux/in6.h 有一句:
 ***   This header was automatically generated from a Linux kernel header
 ***   of the same name, to make information necessary for userspace to
 ***   call into the kernel available to libc.  It contains only constants,
 ***   structures, and macros generated from the original header, and thus,
 ***   contains no copyrightable information.
 ***
 ***   To edit the content of this header, modify the corresponding
 ***   source file (e.g. under external/kernel-headers/original/) then
 ***   run bionic/libc/kernel/tools/update_all.py

2015年4月20日 星期一

cdc_ncm

ncm 好像是比ether 更進步(包含多 protocl) 的 usb network driver

就是兩台裝置,usb host 和 device 都要上 ncm driver
當然 host 要上 ncm host, device 要上 gadget 的 ncm

啟動之後,host 和 device 接起來,
兩台機器用 ifconfig 看,就會出現 usb0 這個 network interface.
有些 embedded device 要自己加上 interface name:
 busybox ifconfig usb0
usb0 Link ecap:Ethernet HWaddr 4E:47:ED:BF:DD:DD
     BROADCAST MULTICAST MTU:1500 Metric:1
     RX packet:0 error:0 dropped:0 overruns:0 frame:0
     TX packet:0 error:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:1000
     RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
然後兩端 (HOST, Device) 要手動設 ip 和 route..
ifconfig usb0 192.160.200.1
route add 192.168.200.2 dev usb0
ifconfig usb0 192.168.200.2
route add 192.168.200.1 dev usb0
這樣就互通了。

kernel doc 也有說明:https://www.kernel.org/doc/Documentation/usb/gadget-testing.txt

2015年4月17日 星期五

AndroidKernel.mk

好像從4.0 開始,android kernel 有 AndroidKernel.mk.
是一些 有關 kernel 的 make rule,像 kernel images and module:
$(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_OUT) $(KERNEL_CONFIG) $(KERNEL_HEADERS_INSTALL)
        $(MAKE) -C kernel O=../$(KERNEL_OUT) ARCH=arm CROSS_COMPILE=arm-eabi-
        $(MAKE) -C kernel O=../$(KERNEL_OUT) ARCH=arm CROSS_COMPILE=arm-eabi- modules
        $(MAKE) -C kernel O=../$(KERNEL_OUT) INSTALL_MOD_PATH=../../$(KERNEL_MODULES_INSTALL) INSTALL_MOD_STRIP=1 ARCH=arm CROSS_COMPILE=arm-eabi- modules_install
        $(mv-modules)
        $(clean-module-folder)
        $(append-dtb)

還有 menuconfig:
kernelconfig: $(KERNEL_OUT) $(KERNEL_CONFIG)
        env KCONFIG_NOTIMESTAMP=true \
             $(MAKE) -C kernel O=../$(KERNEL_OUT) ARCH=arm CROSS_COMPILE=arm-eabi- menuconfig
        env KCONFIG_NOTIMESTAMP=true \
             $(MAKE) -C kernel O=../$(KERNEL_OUT) ARCH=arm CROSS_COMPILE=arm-eabi- savedefconfig
        cp $(KERNEL_OUT)/defconfig kernel/arch/arm/configs/$(KERNEL_DEFCONFIG)
所以要做 menuconfig。
就用 kernelconfig 就可以。


AndroidKernel.mk 是由 android device folder 下 target chip 相關目錄的 AndroidBoard.mk include 的。
所以要先 . build/envsetup && lunch 後才有辦法做 make target.

2015年4月8日 星期三

flashall.sh:
fastboot flash boot boot.img

2015年3月31日 星期二

build android 5.0

debian jessie 沒什麼問題。

openjdk-7, 在 mysenvsetup.sh 加上 JAVA_HOME 宣告,指定到 jdk-7
build fail : 缺lsop.

在 ubuntu 10.04 (lucid) 上要 build 有兩個問題:
  • java7
  • python2.7
又要維持能 build 2.3,所以必須要並存。

java7 : 到 Oracle download jdk7 的 tar 檔。
解開放在 /usr/lib/jvm/ 下。
並且 export JAVA_HOME 到 那裡。

python2.7 的話,一樣,download source 下來,configure, make & install
但是要注意,要 install 到 local,所以 configure 時...
./configure --prefix=/home/charles-chang/pyton26/
這樣 build 玩install 才會正確,python lib 才會找到正確的地方。
還有,android build 需要 zip2 module,
configure 會檢查系統有沒有安裝 libbz2-dev,
如果沒有,就不會 build bz2 module。
所以記得要install 玩再configure

install 後,還要改 path:
export PATH=/home/charles-chang/python27/bin/:$PATH
這樣才會用到 python2.7

很奇怪的是,build script 在 linux 指定用 openjdk, 在 Mac, Windows 用 Oracle jdk.
所以上面的安裝build 會有 error,就去改 build script,不要指定 openjdk 就可以。

2015年3月10日 星期二

split video file with ffmpeg

ref: http://stackoverflow.com/questions/5651654/ffmpeg-how-to-split-video-efficiently

結果新版 ffmpeg 要指定 -vcodec, -acodec 才行。
舊版的只需要用 -codec 就可以。

所以 command 是:
ffmpeg -i DOS.mkv -t  1:10:20 -acodec copy -vcodec copy DOS1.mkv
ffmpeg -i DOS.mkv -ss 1:10:20 -acodec copy -vcodec copy DOS2.mkv
以上的例子就是把 DOS.mkv 從 1:10:20 分成前後兩段。

ref: http://superuser.com/questions/820747/slicing-video-file-into-several-segments

比較不好,,要要 encoding...
ffmpeg -i input.mp4 -c:v libx264 -crf 22 -map 0 -segment_time 9 -g 9 -sc_threshold 0 -force_key_frames "expr:gte(t,n_forced*9)" -f segment output%03d.mp4


ref: https://matthewsdan.wordpress.com/2015/04/16/ffmpeg-split-video-into-custom-number-of-clips/

這個不用 encoding..

for i in *.mp4 *.flv *.avi *wmv; do ffmpeg -i "$i" -f segment -segment_time 5 -c:v copy -reset_timestamps 1 output%d.avi; done
也就是說:
ffmpeg -i XXX.mp4 -f segment -segment_time 5 -c:v copy -reset_timestamps 1 output%d.mp4
其實就是這一篇:http://rachid.koucha.free.fr/tech_corner/pty_pdip.html

2015年3月9日 星期一

logwrapper : show stdout on logcat buffer

在做 vold fsck_msdos 時發現,vold 執行 external program : fsck_msdos,竟然可以把 fsck_msdos 的 stdout 導到 logcat 中。
並且加上 log_tag.

所以看一下,是..
        const char *args[5];
        args[0] = "/system/bin/fsck_msdos";
        args[1] = "-p";
        args[2] = "-f";
        args[3] = fsPath;
        args[4] = NULL;

        rc = logwrap(4, args, 1);

就是用 logwrap( ) 來呼叫。

vold 有實做自己的 logwrap( ), 就在 logwrapper.c

ref: http://developer.android.com/tools/debugging/debugging-log.html#viewingStd

另外,android 也可以把 stdout, stderr 重導到 logcat.
就是上面的說明。

$ adb shell stop
$ adb shell setprop log.redirect-stdio true
$ adb shell start

fsck_msdos , cluster numbers and alloc memory

因為一做fsck 就一堆 process 被kill,所以想找一下..
好像是 fat.c 的 readfat( ) 的 calloc:
fat = calloc(boot->NumClusters, sizeof(struct fatEntry))
拿 500G hd, 這兩個值 (NumClusters, sizeof fatEntry) 是 (15258357, 16)
拿1G, 是 (251155,16)
拿16G,是(1930019,16)
拿32G,是(1927187,16)

1G 的,把 boot sector data 有關
//system/bin/fsck_msdos(  687): NumSectors: 2013184, ClusterOffset: 3942, SecPerClust: 8
I//system/bin/fsck_msdos(  687): NumClusters:251155
32G:
I//system/bin/fsck_msdos(  687): NumSectors: 61700096, ClusterOffset: 30082, SecPerClust: 32
I//system/bin/fsck_msdos(  687): NumClusters:1927187
16G
I//system/bin/fsck_msdos(  687): NumSectors: 30910462, ClusterOffset: 30158, SecPerClust: 16
I//system/bin/fsck_msdos(  687): NumClusters:1930019
500G
I//system/bin/fsck_msdos(  687): NumSectors: 976773166, ClusterOffset: 238316, SecPerClust: 64
I//system/bin/fsck_msdos(  687): NumClusters:15258357

2015年3月6日 星期五

print to logcat from native c program

在 android 系統,c program, (不是由 dalvik run) 要 print 到 logcat 的方法。
ref:
  • http://stackoverflow.com/questions/10274920/how-to-get-printf-messgaes-written-in-ndk-application
  • http://stackoverflow.com/questions/6426911/c-c-printfs-wheres-it-appears-in-a-android-native-code

android framework 本身的參考 code, 可以看 external/ppp/android/

大概就是:

source code 要 include android/log.h 這個header.
Android.mk 要加上 cutils 這個 library:
LOCAL_SHARED_LIBRARIES := libcutils
然後 source code 中就可以用:
__android_log_print(ANDROID_LOG_INFO, "name", "message with %", argument ...)
來印出message 到 logcat

2015年3月2日 星期一

STM32F4 Discovery board, in Debian Jessie

其實是follow : http://www.wolinlabs.com/blog/linux.stm32.discovery.gcc.html

結果:

啟動 stlink/st-util 時出現 error
2015-03-02T14:22:33 WARN src/stlink-usb.c: Error -3 (Permission denied) opening ST-Link/V2 device 001:003

結果是因為 /etc/udev/rules.d/45-usb-stlink-v3.rules 要加GROUPE:
# STLink Device
SUBSYSTEM=="usb", ATTR{idVendor}=="0483", ATTR{idProduct}=="3748", MODE="0666",GROUP="plugdev"


還有..

啟動 gdb 後..出現:
warning: File "/home/charles-chang/teatime/discovery/stm32_discovery_arm_gcc/blinky/.gdbinit" auto-loading has been declined
 by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".
To enable execution of this file add
 add-auto-load-safe-path /home/charles-chang/teatime/discovery/stm32_discovery_arm_gcc/blinky/.gdbinit
line to your configuration file "/home/charles-chang/.gdbinit".
To completely disable this security protection add
 set auto-load safe-path /
line to your configuration file "/home/charles-chang/.gdbinit".

所以就 follow instruction, 在 home 下 create file: ~/.gdbinit
set auto-load safe-path /
就可以 auto-load.


然後是 ref: http://www.wolinlabs.com/blog/stm32f4.semihosting.html

這部份比較沒問題,就照著做,download & build openocd,
semihosting 的 example 在上面就已經download 好了 (git)
所以只要 build 就可以。

然後啟動 openocd, 再啟動 gdb,
semihosting 的 output 會顯示在 openocd 那一端。

* 有點問題的是,進 semihosting 後,用 回 stlink 好像有點問題。最後解決的方法是 nb 重開機..@_@

2015年2月25日 星期三

firefox 沒辦法變更首頁

不管在 option 怎麼設,開啟首頁一定是yahoo.
後來在 help icon -- 疑難排解資訊 -- user.js 偏好設定出現:
 您的設定檔資料夾中有一個 user.js 檔案,當中包含不是由 firefox 所建立的偏好設定
打開,是在 c:/Document and Settings/charles.chang/Applaction Data/Mozilla/Firefox/Profile/em2jesdsdsdsds/user.ja
有...

刪除掉這個user.js, 就可以重新設定 首頁了

2015年2月16日 星期一

為rt5625 codec 的 sysfs 增加一個 mic gain attr

mic gain 是 RT5625_MIC_CTRL,
使用的 write function 是:
snd_soc_write(codec,RT5625_MIC_CTRL,value);
read function 是:
int data = snd_soc_read(codec,RT5625_MIC_CTRL);
所以 sysfs 的 show 和 store:
最後,在 rt5625_probe( ) 裡,加上:
        ret = device_create_file(codec->dev, &dev_attr_mic_ctrl);

        if (ret < 0 ) {
                dev_err(codec->dev,
                        "Failed to create mic_ctrl sysfs files: %d\n", ret);
                return ret;
        }
就可以了,
然後在機器啟動後,在 /sys/bus/i2c/drivers/rt5625-codec/0-001e 下,就會出現:
mic_ctrl

cat mic_ctrl 就會顯示 reg22 的值。
echo 800 > mic_ctrl 就會把 800 寫入 reg22

2015年2月6日 星期五

udevadm -- print out sys udevent

udevadm 可以用來 print udevent 的內容。

ref: https://www.suse.com/zh-tw/documentation/sles11/book_sle_admin/data/sec_udev_debug.html

摘錄:

14.5 監控執行中的 udev 精靈

udevadm monitor 程式可用來視覺化驅動程式核心事件以及 udev 事件程序的時間。
UEVENT[1185238505.276660] add   /devices/pci0000:00/0000:00:1d.2/usb3/3-1 (usb)
UDEV  [1185238505.279198] add   /devices/pci0000:00/0000:00:1d.2/usb3/3-1 (usb)
UEVENT[1185238505.279527] add   /devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0 (usb)
UDEV  [1185238505.285573] add   /devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0 (usb)
UEVENT[1185238505.298878] add   /devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10 (input)
UDEV  [1185238505.305026] add   /devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10 (input)
UEVENT[1185238505.305442] add   /devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10/mouse2 (input)
UEVENT[1185238505.306440] add   /devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10/event4 (input)
UDEV  [1185238505.325384] add   /devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10/event4 (input)
UDEV  [1185238505.342257] add   /devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10/mouse2 (input)
UEVENT 行會顯示核心已透過網路連結傳送的事件。UDEV 行會顯示已完成的 udev 事件處理常式。列印時間是百萬分之一秒。介於 UEVENT 和 UDEV 之間的時間是指 udev 處理此事件所耗費的時間,或者是 udev 精靈延遲執行以便此事件能與執行中相關事件同步的時間。例如,硬碟分割區的事件始終會等待主要磁碟設備事件完成,因為分割區事件可能與主要磁碟事件向硬體查詢的資料有關。

udevadm monitor --env 會顯示完整的事件環境:
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10
SUBSYSTEM=input
SEQNUM=1181
NAME="Logitech USB-PS/2 Optical Mouse"
PHYS="usb-0000:00:1d.2-1/input0"
UNIQ=""
EV=7
KEY=70000 0 0 0 0
REL=103
MODALIAS=input:b0003v046DpC03Ee0110-e0,1,2,k110,111,112,r0,1,8,amlsfw
udev 也會將訊息傳送到 syslog。控制哪些訊息要傳送到 syslog 的預設 syslog 優先程度是在 udev 的組態檔 /etc/udev/udev.conf 中指定。執行精靈的記錄優先程度可使用 udevadm control log_priority=level/number 來變更。

mount --bind

ref: http://www.cnitblog.com/gouzhuang/archive/2010/04/21/mount_bind.html

很有趣。
類似於 ln -s

mount --bind 可以用來取代任何以存在的file, folder.

以 ref 的 link 來看。
可以用
# mout --bind /tmp/init.rc /init.rc
用 /tmp/init.rc 取代 /init.rc

也可以用 mount --bind 取代掉整個目錄。

Editor

試試 Kate 跟 Bluegfish.
Kate 用 Qt, 所以會裝一堆 Qt library.

2015年2月5日 星期四

64g 和 wifi ap

64G 的是 exfat 格式。

Welcome to fdisk (util-linux 2.25.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/sdd: 59.8 GiB, 64222134272 bytes, 125433856 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device     Boot Start       End   Sectors  Size Id Type
/dev/sdd1       32768 125433855 125401088 59.8G  7 HPFS/NTFS/exFAT

一片64g用在 altis 的 dvr 上了 (原8G已經放起來)

2015年2月3日 星期二

android notes, Audio, Alsa, buffer size & latency

在 framework/base/media/libmedia/AudioTrack.cpp (getMinFrameCount) :
    // Ensure that buffer depth covers at least audio hardware latency
    uint32_t minBufCount = afLatency / ((1000 * afFrameCount) / afSampleRate);
    if (minBufCount < 2) minBufCount = 2;

    *frameCount = (sampleRate == 0) ? afFrameCount * minBufCount :
              afFrameCount * minBufCount * sampleRate / afSampleRate;
    return NO_ERROR;

Latency 是問hardware.,,經由OutputDescriptor 傳回 (include/media/AudioSystem.h)
    class OutputDescriptor {
    public:
        OutputDescriptor()
        : samplingRate(0), format(0), channels(0), frameCount(0), latency(0)  {}

        uint32_t samplingRate;
        int32_t format;
        int32_t channels;
        size_t frameCount;
        uint32_t latency;
    };
或是 IAudioFlinger.

這個latency 直,是由 alsa 的 bufferSize 算出來的。
在 hardware/alsa_sound/alsa_default.cpp..
static alsa_handle_t _defaultsOut = {
    module      : 0,
    devices     : AudioSystem::DEVICE_OUT_ALL,
    curDev      : 0,
    curMode     : 0,
    handle      : 0,
    format      : SND_PCM_FORMAT_S16_LE, // AudioSystem::PCM_16_BIT
    channels    : 2,
    sampleRate  : DEFAULT_SAMPLE_RATE,
    latency     : 40000, // Desired Delay in usec
    bufferSize  : 8192, // Desired Number of samples
    mmap        : 0,
    modPrivate  : 0,
};
這裡的bufferSize, 變更的話, latency 值就會改變。

2015年1月8日 星期四

Chrome on Jessie -- 環境變數問題

發現在panel 新增一個 chrome button , lunch chrome 的話,他好像吃不到環境變數 (proxy, no_proxy).
但是開 console, 直接launch chrome, 他又吃得到。

我的 http_proxy 是設定在 system setting 中。
所以開啟 console 會顯示出來。

後來改了,在 .profile 中加上。
這樣,chrome button 啟動的 chrome 也吃得到了...

2015年1月5日 星期一

add layoutlib.jar into eclipse project

android framework 開放的 api, 被包成兩個:
  • android.jar
  • layoutlib,jar
但是 default 只有引入 anroid.jar

所以 eclipse 要 reference layoutlib.jar 的 api, 要自己把他加到 project build path 中。
ref: http://iwillbemyself.blog.163.com/blog/static/170223228201302222122929/

Project Properties -- Java Build Path -- Add Library -- User Library -- User Libries -- New -- 
Name (自己填) -- OK
選 add External jars -- 選到 layoutlib.jar


官方:https://developer.android.com/tools/support-library/setup.html

標籤

網誌存檔