ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2011年4月29日 星期五

Localize repo

怕忘記,寫一下(還記得的)
  1. 照標準 作 repo init --mirror ,這會 download .repo 這個 folder,裡面有 repo command source code和 manifest 相關文件.
  2. 照 vendor user guide,把 vendor bsp 的 default.xml copy 到 .repo ..../ 下,覆蓋 --- 這段者要在減少 download 不需要的 project,和 download 而外需要的 project
  3. repo sync
  4. vendor 的 manifest xml 把 kernel, bootloader 拆開,所以要自己git clone kernel 和 bootloader
  5. 修改 .repo 下的 manifest,把 remote 的 server 改為自己 -- checkout platform/manifest.git 出來改,branch 為 localize 後 push 回去。
  6. repo init -u url 改為自己這台server , branch 選 localize -- 把 code clone 出來
  7. 上 vendor bsp 的 patch -- 這個 patch 會把有改動的project create 一個 branch 出來 (vendor_ver)
  8. repo forall -c 'git checkout -b mybranch' -- 因為 repo sync 完checkout 的 code,是不在任何 branch 上,所以統一 create 出 mybranch 這個 branch
  9. repo forall -c 'git push mybranch korg' -- 所有的 project 都在 remote 端 create mybranch
  10. 修改 .repo 下 manifest ,把 default rev 改為 mybranch
    -- 要修改 .repo 下的 manifest,create 一個 mybranch, push 回去。 --- 注意檢查所有 xml 李的 project,rev 都刪掉 (用 mybranch)
OK,這樣 client 就可以用 repo init -u localserver -b mybranch

2011年4月28日 星期四

Android toolbox

Android 的 shell command support 用類似 busybox 的方式,統一由一個 toolbox 程式提供。

command 的 source 對應 - tools.h 由 Android.mk 產生
TOOLS_H := $(intermediates)/tools.h $(TOOLS_H): PRIVATE_TOOLS := $(TOOLS) $(TOOLS_H): PRIVATE_CUSTOM_TOOL = echo "/* file generated automatically */" > $@ ; for t in $(PRIVATE_TOOLS) ; do echo "TOOL($$t)" >> $@ ; done 所以 tools.h 要在 out/target/product/imx51_bbg/obj/EXECUTABLES/toolbox_intermediates 找

upgrade 的作法: 1. 修改 init.rc,增加一個小 program, mount external sd card, check install script exist, execv it.

upgrade 的作法:
1. 修改 init.rc,增加一個小 program, mount external sd card, check install script exist, execv it.

external sd card 的 shell script 好像有一些限制,即使已經把需要的 program 都準備再 sd card 中,有些command 還是不能動作。
跟 launch sd card script 的位置有關:
  1. 太早 launch -- dd command 似乎無效
  2. 太晚 launch -- 沒有辦法 dd 已經 mount 得 partition ,, resource busy.


猜測是需要 /system 下的某些 file 才能正常執行


Try:


system.img 也放在 sd card,mount loop 回來。
實做的方式有幾種:

把這段特殊的 init.rc 分開,放在 sd card 中,修改原 init program,去include 近來..



已經開始亂搞 @_@

因為沒有 umount command,所以自己加:

結果要加在一堆地方:
buildin.c : 主體 do_umount
keyword.h : 用 MACRO 宣告 umount, do_umout , 會自動產生 K_umount.
parser.c : 在 case 'u' 的地方要 compare 'mount', return K_umount.

... 結果umount 造成 kernel panic !!!

最後:

放棄使用 script,只好用單一 program 來作,單一program 作 dd 的動作..

dd 就由 toolbox/dd.c copy 過來好了..



developement process :

用uboot 的 fatload function 直接從 external sd load uramdisk.img 這樣就不用每次燒錄..
mmc read 2 0x90800000 0x800 0x2000 fatload mmc 0:1 0x90c00000 uramdisk.img bootm 0x90800000 0x90c00000 要注意,從 9.4 開始, ramdisk 的 load address 已經從 0x90b00000 改到 0x90c00000

為了方便,可以在 bootloader 下這個command:
setenv bootdev 'mmc read 2 0x90800000 0x800 0x2000;fatload mmc 0:1 0x90c00000 uramdisk.img;bootm 0x90800000 0x90c00000' 或是直接都從 sd load: setenv bootenv 'fatload mmc 0:1 0x90800000 uimage;fatload mmc 0:1 0x90c00000 uramdisk.img;bootm 0x90800000 0x90c00000'
然後啟動作:
run bootenv ** 這樣的設定沒有設 bootargs...

2011年4月27日 星期三

u-boot memo - IF THEN

大概記一下 u-boot 有 if then 的command support,在 common/hush.c 還有 比較 的 command support 在 common/cmd_itest.c 在自己的 include/configs/XXX.h 中加入 #define CONFIG_SYS_HUSH_PARSER 1 /* Use the HUSH parser */ #ifdef CONFIG_SYS_HUSH_PARSER #define CONFIG_SYS_PROMPT_HUSH_PS2 "> " #endif 就可以了

write program launched by init.rc

要在 init.rc 中加入一個 program,不是 service,是用 exec 執行的程式。

首先,要把 init.rc 的 loglevel 改為 6,這樣才會印出有沒有去 run 這個程式。
但是這樣 程式的 printf 還是不會輸出..

修改 system/core/init.rc

iff --git a/init/init.c b/init/init.c index f5adb5b..48d60e6 100755 --- a/init/init.c +++ b/init/init.c @@ -180,7 +180,7 @@ int wait_for_service(char *filename) { sprintf(tmp, "%d,%d", dup(fd), sz); add_environment("ANDROID_PROPERTY_WORKSPACE", tmp); /* redirect stdio to null */ - zap_stdio(); + open_console(); setpgid(0, getpid()); /* execute */
如果是用 service 啟動的program,只要加上 console 這個 attribute 就可以了
這樣那個 program 的 printf 輸出也可以顯示出來了..

如果是修改 init.rc, (device/xxx/init.rc)
之後 make 就可以產生新的 ramdisk (uramdisk.img)

copy 到 sd 的第一個partition 後,可以在 system console 中 live update
-- 因為 ramdisk 和 kernel 都是由 bootloader load 到 ram 執行,所以可以 live update..
mount -t vfat /dev/block/mmcblk1p1 /mnt/extsd dd if=/mnt/extsd/uramdisk.img of=/dev/block/mmcblk0 bs=1048576 seek=6 因為 android 的 dd 不認識 M, k 等單位符號,所以要先把 M 算好。

New microSD card & pendriver



Kingston 4G class 4.
Transcend 16G class 2
SanDisk Cruzer 8G

HD Tune 結果:

Kingstone 4G class 4 : 17.3


Transcend 16G Class 2: 9.3


Sandisk Cruzer 8G : 28.9



ref :

2011年4月19日 星期二

buildin variables in repo forall command

repo forall 內建幾個環境變數,讓你方便作 每個 project 的操作。
用 repo help forall 就會列出:
Environment
-----------
pwd is the project's working directory. If the current client is a
mirror client, then pwd is the Git repository.

REPO_PROJECT is set to the unique name of the project.

REPO_PATH is the path relative the the root of the client.

REPO_REMOTE is the name of the remote system from the manifest.

REPO_LREV is the name of the revision from the manifest, translated to a
local tracking branch. If you need to pass the manifest revision to a
locally executed git command, use REPO_LREV.

REPO_RREV is the name of the revision from the manifest, exactly as
written in the manifest.

shell positional arguments ($1, $2, .., $#) are set to any arguments
following <command>.

Unless -p is used, stdin, stdout, stderr are inherited from the terminal
and are not redirected.

所以要在 android project 中,把所有 project 都加入一個 remote target ,可以用 repo forall -c 'git remote add mynb ssh://checkonb/home/checko/androidcode/$REPO_PATH' 這是把nb 上的 android source 加到自己的 remote 中。
要使用 repo 內建環境變數, forall -c 後面的 command,要用小字串符號括起來 ' ',這樣 repo 才會正確轉換 $NAME 為變數內容。

可以用
repo forall -c 'echo $REPO_PROJECT $REPO_PATH' 看一下變數的內容
REPO_LREV : local revision (commit)
REPO_RREV : remote revision/branch 
因為 repo sync 只會 checkout revision 出來,不會順變 checkout -b branchname,所以可以用
repo forall -c 'git checkout -b $REPO_RREV'
然後用 repo status 就可以看每個 project 的 branch name ..

2011年4月15日 星期五

先用 diff compare 一下兩個 folder.. 找到不一樣的地方 找到不一樣的地方,所屬project 的 root folder.. 先把另一個 folder (target folder) 加到 remote 中. git remote add cv7000 ~/cv7000/-project-path git fetch cv7000 然後去target folder 看一下目前是在哪一個 branch 工作, 再到剛剛local 的 project 去作 merge git merge cv7000/this-branch OK 後,就可以 push 到 server 去 git push
這樣作,local 的 project 是從 remote branch checkout 出來,所以 upstream 是 remote-branch。 所以 push 會自動 update 到 server 去。

repo sync fail -- rebase fail

repo sync 包含 merge 的動作,所以要是只是因為修改了 manifest (增加, 減少 project),而想從 server 啦一些 project 回來。

最好先把手上的 branch 整理, commit 一下,然後 checkout 當初最基礎的 版本出來 (就是 manifest.xml 裡的 rev=)。再作 repo sync。

做完後, project 都 update 完了,再 checkout 出剛剛的branch/tag, 繼續原來的工作。



如果沒有這樣作,在做 repo sync 出現 error,就 follow error message,到 fail 的 project 去 "處理" 一下...
git rebase --abort git checkout remote/def-rev git branch -D org-branch

solve : make -j4

使用 make -j4 的話,會出現 acp, mke2fs 的相依姓問題。 用 make 則不會。 所以在第一次build 的時候 (acp,mke2fs 還沒 build 出來過),先用 make acp make mke2fs 把他門都 build 好,接下來就可以用 make -j4 來加速了

2011年4月14日 星期四

smbclient -- command line smb share client

用來連 samba 跟 Windows Share.

command :
/$ smbclient //192.168.147.235/source -U softwaretest -W lowtech 注意是用 unix 的 folder seperator (/) 不是 windows 的 (\)
-U  : with user name.
-W  : with working groupe
login 完成後,就可以用類似 ftp 的 command. get put ls dir cd 來傳檔,工作。



其他:
-L  : browse the share -- 看看/列出 內容就好。
-W 的 workgroup 很重要,如果沒有加這個 option, smbclient 會用 /etc/samba/smb.conf 的設定。
如果和 share server 不一致,會有 session setup failed: NT_STATUS_LOGON_FAILURE 的 error

2011年4月13日 星期三

diff two source folders

因為 vendor patch 過的 source code 沒有完整的 repo project 資訊,所以只好用 diff 來找出後來自己修改過的地方。
因為 build 過的 source folder 包含一堆不是 source code 的東西,還有一些 git folder 都不要加入 比較,所以要用一些 option 來排除
所以我用的 command 是:
diff -x '.*' -r --brief -x 'out' -x 'kernel_imx' -x 'bootable' --exclude='*.ko' --exclude='*.o' --exclude='*.a' --exclude='*.mod' --exclude='*.cmd' myandroid91 myandroid9.1local 2>&1 | tee difflog
說明:
-r 是 recursive 的意思
-x 是 ignore folder 的意思
--brief 是只要報告不一樣就可以,不必列出不同的內容
--exclude 是排除 xxx

很慘,因為 diff 連 folder attribute 都會compare,而 main trunk 因為大家還不會用 git remote 作 merge ,所以修改了fild attribe 讓所有人都可以 access,導致 diff 的內容整個都...

所以還是要咧出內容 (取消 --brief ),這樣才可以看出真正 source code 的修改。

worklog -- upgrade os from external sd

最簡單的作法:
1.在開機偵測 external sd -- mount ?
2.check pt.sh 存在 ?
3.啟動 shell, mount external sd system partition, run shell script.
所以第一個要解決:插著 external sd card 開機問題。
==> 就改 sd driver initial sequence.
實做的方式:
因為 init 沒有 shell script 的 if function。
所以整個動作都只能自己作,寫一個類似 calibration 的小程式。在類似的位置 launch 起來。

另外,要先 merge main trunk 進來?
==> 每個 project 都要加 remote,然後 merge.
===> 先修改一下,把所有的 project 的 remote 都改為相同,不要分 korg 跟 9.1,這樣用 repo forall 作比較簡單。
所以要作:把 remote 的 9.1 改成korg..
1. 修改 manifests/default.xml
2.把 9.1 下的 git project 搬到 android9.1 對應的目錄下
3.test sync & build
* 先在 local 作,再 update 到 server 上..

其他可以作的:
看看可不可以把 busybox 的依賴消除。
好處:
  1. 系統本身就具備 upgrade 的所有程式,所以不必 準備另一組完整的 system 再 external sd.

2011年4月11日 星期一

英式紅茶餅

今天收到的手作 "英式紅茶餅": 酥酥脆脆,剛好,也不會太甜.. 是哪位賢慧的人妻同事嗎? 結果是: 快晉升 大叔 級的 人夫 同事: 自己作的 (我有再三確認是不是他老婆作的)

2011年4月7日 星期四

how to checkout all branches by repo

這一篇http://groups.google.com/group/repo-discuss/browse_thread/thread/a970482df8d5574e/43d1e04621247c13 有說道 repo checkout 一個一個 branch 的方法 repo init --mirror -u git://android.git.kernel.org/platform/manifest.git repo sync repo forall -c 'git push ...' repo init -b froyo repo sync repo forall -c 'git push ...' repo init -b froyo-plus-aosp repo sync repo forall -c 'git push ...'
還是有一點 卡卡的..
大概是因為要加上 Vendor 的 patch ,所以才會這樣。
應該要把動作區分為以下:
  1. localize standard android repo
  2. branch 到 imx_rXX
  3. apply vendor's patch
  4. commitM
這樣 apply 完 vendor patch 的 source rev 會在另一個 repo branch 上。
先 branch 出來,再apply patch。
前面不順暢應該是 branch 的動作不了解..

2011年4月6日 星期三

Dell Service Phone Number

記錄一下 Dell 台灣的服務電話 0080-186-1011

2011年4月1日 星期五

真的作 android repo mirror

2013/03/28
後來 google 修改了 repo,讓他 support local mirror 了。
所以要建制 local mirror 變得很容易:

ref: http://source.android.com/source/downloading.html
真的作的步驟:

先 新增一個 user: git
$adduser git 因為如果使用 git-daemon 預設的 user: gitdaemon,沒有 create group,也沒有 home folder。

到時候到 git-daemon folder 作 repo init 時, repo 會要求產生 pgp key 在 home folder ,會 fail。
所以還是用 git 這個實際存在的 user 來執行好了。

然後在 /home/git 下 create 一個 git-daemon folder 給 git-daemon 用

安裝 git-daemon
$sudo aptitude install git-daemon-run 修改 /etc/sv/git-daemon/run:
三點:
以 git 的身份來 run
增加 --export-all
把 git-daemon 的 source path 改到 /home/git/git-daemon
改好後重新啟動 git-daemon:
$sudo sv stop git-daemon $sudo sv start git-daemon
接著就可以 mirror android 的 code 下來
先到 git-daemon 的目錄:
$sudo su - git $cd git-daemon create 一個用來 mirror 的目錄
$mkdir myandroid $cd myandroid clone + mirror
$repo init -u git://android.git.kernel.org/platform/manifest.git -b froyo --mirror ** repo 要自己先準備好,放在PATH 中。
這樣

接著依照 Vernder BSP 的要求,修改/覆蓋 .repo/manifests/default.xml
然後就做 sync
$repo sync
要等很久..

修改 platform/manifest.xml 把 remote fetch 由 android.git.kernel 改為 robot 或是 gps1004.
branch 後 push 回去
* 要 branch 出來嗎?

repo sync 完先 tar 一份起來。然後 try 一下 client clone 需不需要加 -b local.
** 這個在 manifest.xml 應該有寫了 default branch = froyo
<remote name="korg" fetch="git://android.git.kernel.org/" review="review.source.android.com" /> <default revision="froyo" remote="korg" />

接著就可以作 client 的部份:



結果:

一開始的 repo init, repo sync 還是要用原來的 manifest.xml (default.xml)。
要改成 原廠的 manifest.xml 的動作,是要 repo sync 完後, git clone manifest.git出來改,然後 push 回去。
雖然一開始在做 repo sync 之前,已經把 Vendor 的 default.xml copy 過來,但是 git 的內容沒有修改,
所以只會影響到 server 作 repo sync 的動作。
client 作 repo init 取得的是 git 紀錄的內容,所以是未修改的。
反正步驟就是這樣:
  1. mkdir android_mirrod && cd android_mirror
  2. . repo init git://android.git.kernel.org/platform/manifest.git -b froyo --mirror
  3. . copy Vendor's default.xml to local
  4. . repo sync
  5. . cd && git clone /var/cache/git/android_mirror/platorm/manifest.git
  6. . copy Vendor's default.xml to local
  7. . modify default.xml, chang fetch address to local and add path 'android_mirror
  8. . commit, push
manifest.xml 的 remote fetch location。 參考連結都是直接寫 server address 而已,
但是因為自己作 git repo folder (/var/cache/git) 裡有很多 project, android repo 指示其中一個。所以 fetch address 要加上 android repo folder (這裡我用 android_mirror)。

因為當初server 作 repo init 有加上 -b froyo,所以所有manifest.xml 的修改都只有在 froyo 上。
所以 client repo init 也要加上 -b froyo。


.. 真的作不完....
因為 Vendor 的 kernel 和 bootloader 是分開 clone ,所以要另外 mirror git source 在 local repo server 中。 --- 這部份和 repo 無關,用 git 就可以。
patch 完後,因為 Vendor 沒有給完整的 source tree (source 是有,git source tree 沒有),所以 patch 完後,有一些 project 維持在 no-any-branch 的狀態,這樣是沒有辦法push 回 local server 的。
所以要先都 checkout / branch 出來:
$ repo forall -c git checkout -b vendor_rev
之後才可以 push 回 local server:
$repo forall -c git push korg vendor_rev

就這樣 patch 完,先都 branch 出來,再 push 回 server。


然後檢查patch 完後,所有的 git projectˋ是不是都有在 repo 的 manifest.xml 中 ...
把他加回去..

.. 就用 file 的方式吧..在 local server 用 file 的方式自己 git clone --mirror 每一個沒有加入的 project,然後再修改 manifest.xml

先作一個..

* 這些 source 本來就不在 android.git.kernel.org 中,所以還是另建 一個 remote server ,寫在 manifest 中,不要跟 android repo folder 混在一起好了.

mirroring the android source repo - ref

作個筆記好了,各家的。



http://www.mailinglistarchive.com/repo-discuss@googlegroups.com/msg01246.html Server:

安裝 git-daemon, export path 和 option 要注意
repo init 時要加上 --mirror 這個option.
另外 clone 出剛剛 mirror 的 rep 李的manifest.git 出來。
修改 remote location to local : git://192.168.0.75
再 push 回去,這樣剛剛 mirror 下來的東西才會真的改掉。之後 clinet clone 下來的才會是 local 得 git server address

Client
可以用 git ls-remote git://192.168.0.75/platform/manifest.git 來看 git-daemon 設定 OK 不 OK.
這樣 client 就可以用 repo init -u git://192.168.0.75 改用 local server 的 repo



http://blog.luzi82.com/2010/06/blog-post_19.html
Server

一樣, repo init, 要加上 --mirror.
repo sync
clone manifest.xml 出來改:方法是用 file acccess:
git clone charles@192.168.0.72:var/cache/git/android_mirror/manifest.git git checkout -b local 一樣,改 remote 的 fetch="charles@192.168.0.72:var/cache/git/android_mirror/"
push 回去:
git commit -am 'use local server' git push original local
Client

直接用 file access:
repo init -u charles@192.168.0.72:var/cache/git/android_mirror/platform/manifest.git -b local repo sync

ref : http://www.fm0898.com/show.aspx?id=17570&cid=89
Server

裝 git-daemon ,修改 run
mkdir /var/cache/git/android_mirror 到 /var/cache/git/android_mirror repo init git://android.git.kernel.org/platform/manifest.git --mirror repo sync


ref: http://gregmeiste.com/post/3842942731/mirror-android-repositories-on-a-local-server
Server

Install git-daemon
一樣,到 /var/cache/git 開一個 android_mirror
repo init -u git://android.git.kernel.org/platform/manifest.git --mirror repo sync
修改裡面的 manifest.xml (default.xml),在 server 的另一個地方 checkout 出來,branch, 修改然後 commit, push 回去 (這篇 作者有設一個 user: git)
git clone git@192.168.0.72/platform/manifest.git cd manifest git checkout -b local 然後修改 default.xml:
把 fetch 的 server location 改為 git@192.168.0.72:android_mirror
push 回去
git commit -am 'use local git push origin local

Client
repo init -u git@192.167.0.72:android_mirror/manifest.git -b local repo sync

Video Converter Factory Pro 使用感想 -- 太慢

因為Video Converter Factory Pro 有限時免費的優惠,所以去 download 下來用了。
結果: (跟我自己用 ffmpeg 的結果比較)

有 UI 和預設的一堆 device profile 是比較方便的地方。
還有一些 crop, clip, effect 是 ffmpeg 沒有的。

但是,單就轉檔 來看..

Video Converter Factory 實在太慢了呀 ..

一個 1:12 的影片,用 ffmpeg 轉,大約 20min。
Video Converter Factory Pro 竟然要 1:27

轉的時候我看了一下 cpu loading,只有一個core 達到 90%,其他 3 顆都只有 10~20%。
所以大概是沒有 support multi-thread 吧。

我用 ffmpeg 轉檔是手動下 -thread 4 的 option,所以四個 core 都是 80 ~ 90%。

標籤

網誌存檔