[技術] FreeBSD上安裝Apache + subversion + LDAP(AD Server)

Written on 9:59 上午 by Yu Lai

最近公司的svn server一整個狂當機,於是決定換一台電腦當Server,
除了repository的轉移外,也把OS從XP換到FreeBSD。

以下是安裝的一些過程。

1. 安裝FreeBSD
這個安裝就不寫了,有興趣的人可以參考 FreeBSD Handbook。

2. 安裝Apache
使用ports安裝,由於我們需要透過LDAP來認證使用者,
所以在安裝時記得把LDAP和AUTHNZ_LDAP選項勾選起來,
而在Apache安裝的過程中,會先安裝apr1套件,
此時也記得把LDAP選項勾選起來。

# cd /usr/ports/www/apache22
# make WITH_LDAP_MODULES=yes all install clean


3. 安裝Subversion
# cd /usr/ports/devel/subversion
# make -DWITH_SVNSERVE_WRAPPER -DWITH_MOD_DAV_SVN -DWITH_APACHE2_APR install clean


4. 設定Apache
先確認/usr/local/etc/apache22/httpd.conf裡有以下內容。
LoadModule dav_module libexec/apache22/mod_dav.so
LoadModule dav_svn_module libexec/apache22/mod_dav_svn.so
LoadModule authz_svn_module libexec/apache22/mod_authz_svn.so
LoadModule ldap_module libexec/apache22/mod_ldap.so
LoadModule authnz_ldap_module libexec/apache22/mod_authnz_ldap.so


接著編輯/usr/local/etc/apache22/Includes/svn.conf。
 <Location /svn>
DAV svn
SVNParentPath /svn_repos
SVNListParentPath on

# our access control policy
#AuthzSVNAccessFile /svn_repos/svn-access-file

AuthType Basic
AuthName "Subversion repository"

# Make LDAP the authentication mechanism
AuthBasicProvider ldap

# Make LDAP authentication is final
AuthzLDAPAuthoritative on
AuthLDAPBindDN "CN=svn,CN=Users,DC=blahblah,DC=com"
AuthLDAPBindPassword "xxxxxxxx"
AuthLDAPURL "ldap://ldap-server/CN=Users,DC=blahblah,DC=com?sAMAccountName?sub?(objectClass=*)"
Require valid-user
</Location>


接著編輯/etc/rc.conf,把apache22_enable="YES"加入。最後啟動apache。
# /usr/local/etc/rc.d/apache22 start


5. 建立SVN Repository目錄
# mkdir -p /svn_repos
# chown -R www /svn_repos


6. 轉移SVN Repository
首先在windows下使用舊版的svnadmin將repository db檔dump出來。
D:\SVN>svnadmin dump repos > repos.dump

接著將repos.dump丟到FreeBSD下,再使用新版的svnadmin將dump檔load回去。
# svnadmin create repos
# svnadmin load repos < repos.dump


若repository很多的話,可以透過以下的perl script幫忙。
# cat > load.pl
foreach (@ARGV) {
s/.dump//;
print "Loading $_ repository.\n";
system "svnadmin create $_";
system "svnadmin load $_ < $_.dump";
}
^D
# perl load.pl *.dump


7. 建立定期備份的crontab
這裡我使用了crontab+perl script來進行每周日的早上4點進行備份的動作,
備份檔保留60天,超過的備份檔會被移除。
# mkdir -p /svn_backup
# cat > /svn_backup/backup.pl
#!/usr/bin/perl

# Get date information
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
$Month += 1;
$file_name = sprintf "/svn_backup/svn-%04d%02d%02d.tgz", $year, $mon, $mday;

# Do backup
system "/usr/local/etc/rc.d/apache22 stop"; # Stop apache
chdir "/svn_repos/";
system "tar zcvf $file_name *";
system "/usr/local/etc/rc.d/apache22 start"; # Start apache

# Remove old backup file
chdir "/svn_backup/";
@tgz_files = glob "*.tgz";
foreach $file (@tgz_files) {
unlink $file if -M $file > 60;
}
^D
# chmod +x /svn_backup/backup.pl
# crontab -e
0 4 * * 0 /svn_backup/backup.pl

[技術] Milestone + mCool299 + TransProxy

Written on 12:27 上午 by Yu Lai

我一聽到mCool有支援Skype, 今天就跑去申請了mCool 299,
申請好後, 也請中華電信把internet APN關掉, 並在Milestone上設定:
APN: emome
Proxy: 10.1.1.1
Port: 8080
一如預期, 設定好後WWW, GMail, Skype都OK,
但是Market, Maps, YouTube都不行.

後來想了解一下為什麼, 於是Google了一個晚上,
發現似乎是Android只有Browser會走APN的proxy.
其他的App好像傻了一樣, 都直接連線, 難怪Android+mCool會有些App不能用.
能用的都是中華電信特別開出來的才能用, 搞得好像Android用的mCool是被閹割過似的.

沒關係, App不走Proxy, 那就找方法強制它走Proxy.
在XDA-Developers上有個人有wifi環境需要走proxy才能用的問題,
於是就去抓了transproxy並配合iptables和voila完成了transparent proxy的功能.
最後還把它打包成APK給大家下載使用, 真是佛心來的.
網址如下: http://forum.xda-developers.com/showthread.php?t=766569

安裝上, 先確認Milestone要先ROOT過, 並且先斷線.
我是抓TransProxy2.04.apk回來安裝,
安裝時還遇到找不到iptable的問題,
於是先到http://code.google.com/p/cmwrap/downloads/list抓回來放在/system/bin下.
安裝完後, 執行它, 在設定裡選HTTP, 10.1.1.1, 8080, 開啟.
設定完再重新連線, 以上設定中有錯誤發生, 請重開機試試吧.
最後把Market或Maps打開試看看, 你就會發現都可以用了.

PS1: 因為這是transparent proxy, 所以當你要用wifi不走mCool時, 請關掉, 不然你會不能用. XD

PS2: 其實emome說mCool不能當數據機給NB上網, 但配合wireless tether+NB的Proxy似乎.... 嘿嘿.

[技術] SDRAM研究心得

Written on 12:23 上午 by Yu Lai

唉,只能說大學老師教的時候沒學好。
導致現在要和SDRAM打交道時被它欺負啊 >__<~。
以下主要是參考http://www.eetop.cn/bbs/thread-57279-1-1.html
後而寫出來覺得有用到的心得,就當做個記錄吧。

一. 基本結構
1. Physical Bank
在CPU的Memory system中,為確保CPU的正常運作,讀寫時必須一次將整個data bus的位寬的data進行傳輸。也就是說Memory Chip與CPU之間必須以此位寬來進行傳輸,此位寬稱為Physical Bank的位寬。簡稱P-Bank或Rank。

2. Chip bit width
由上文得知,Memory System必須組成一個P-Bank的位寬才能使CPU正常運作。加上Memory Chip也有自己的bit width,也就是每次傳輸所能提供的data量。所以在使用上會把數個Memory Chip組合成一個P-Bank的bit width來使用。
例如: CPU的data bus的bit width為64-bit,SDRAM為16-bit,所以需要4顆(4x16=64bit)。
當然,理論上可以實做出64-bit的bit width的SDRAM Chip,但因成本與實用性方面的考良,一般不太會這樣用。

二. SDRAM的內部結構
1. Logical Bank與Chip bit width
SDRAM內部是由儲存陣列所組成,這個儲存陣列就像一個表格(Table)一樣,先指定好行(Row),再指定列(Column),我們就可以準確地找到所需要的欄位(Field),這就是memory chip addressing的基本原理,這種Row-Column定址的方式稱為Multiplexing。對於Memory來說,這個Field我們稱為儲存單元(Cell),也有廠商稱之為Word,而這個儲存陣列就是Logical Bank,簡稱L-Bank或Bank。
由於技術與成本的原因,我們不可能只做一個全容量的Bank,而且由於SDRAM的工作原理限制,單一個Bank會造成嚴重的Addressing Collision,大幅降低效率。所以我們會在SDRAM內部分割成多個Bank,目前SDRAM規範是4個,而DDR-II的標準則是8個。
這樣在Addressing時就要先確定是哪個Bank,然後再這個選定的Bank中選擇對應的Row與Column。也就是說一次只能是一個Bank在運作,每次運作的data量就是Bank中一個Cell的容量。由前面我們得知,Memory Chip一次傳輸的data量即為Chip的bit width,也就是說Cell的大小也就是Chip的bit width。

2. Memory Chip的容量
在瞭解SDRAM的內部結構後,我們知道Memory Chip的所有儲存容量就是所有Bank中儲存單元的容量總合。也就是 儲存容量 = L-Bank的數量 x 行數 x 列數 x Cell的大小。
一般在表示上會採用MxW或是BxMxW的方式來表示。
如"8M x 8",8M個Word,1個Word有8bit width,總共為64Mbit。
或"4-BANKS x 2,097,152-WORDS x 8-BITS",總共為64Mbit。

三. SDRAM腳位說明
CLK : Master Clock
CKE : Clock Enable
/CS : Chip Select
/RAS : Row Address Strobe
/CAS : Column Address Strobe
/WE : Write Enable
DQn : Data I/O
DQM : Output Disable / Write Mask
An : Address Input
BAn : Bank Address
Vdd : Power Supply
VddQ : Power Supply for Output
VSS : Ground
VSSQ : Ground for Output

四. SDRAM命令真值表

CommandSymbol/CS/RAS/CAS/WEBAnA10An
Device deselectDSLHXXXXXX
No operationNOPLHHHXXX
Burst stopBSTLHHLXXX
ReadRDLHLHVLV
Read(with PRE)RDALHLHVHV
WriteWRLHLLVLV
Write(with PRE)WRALHLLVLV
Bank activateACTLLHHVVV
Precharge bankPRELLHLVLX
Precharge all BankPALLLLHLXHX
Mode register setMRSLLLLLLX

(V=Valid, X=Don't Care, H=Logic High, L=Logic Low)

FunctionSymbolCKE/CS/RAS/CAS/WE/Address
Auto RefreshREFHLLLHX
Self RefreshSREFLLLLHX

(V=Valid, X=Don't Care, H=Logic High, L=Logic Low)

五. SDRAM的內部基本操作
1. Power-up與Initialization Sequence
SDRAM在Power up時必須完成下列的步驟。
-CLK, CKE, /CS, DQM和DQ腳位須維持在low直到供電穩定(Power stabilize)為止。
-在Power stabilize後的100us內,chip的CLK必須有穩定的clock提供進來。
-同時要將CKE和DQM驅動到high,直到100us後完成整個Power-up sequence。
在完成Power-up sequence後接著就是要做Initialization sequence。在SDRAM內部裡有一個Logical Control Unit,並有一個Mode Register(MR)為期提供控制參數。而設定MR也是Initialization sequence最主要的動作。其過程如下:(PALL和REF會在下面說明)
-首先必須先等至少200us的clock輸入穩定期。
-接著對所有的Bank進行Precharge命令(PALL)。
-在等tRP時間後,做至少2次的Refresh命令(REF)。
-最後配合An和BAn做Mode Register Set命令(MRS)將控制參數設置到SDRAM中。An和BAn的控制參數定義如下:A0~A2:Burst Length,A3:Burst Type,A4~A6:CAS Latency,Other:0。設定完MR後就開始進入正常的工作狀態。

2. Bank Active (Row addressing)
在進行Read/Write操作前,對應的Bank和Row位址必須先透過Bank activate命令(ACT)來指定。在/CS和Bank定址的同時,RAS(Row Address Strobe)也處於有效的狀態。此時An位址線則發送Row Address。從An的位址線數量我們也可以知道該SDRAM具有多少個Row(取2的n+1次方)。

3. Read/Write (Column addressing)
在Bank和Row Address確定後,就要進行Read/Write命令和Column addressing。此時除了/CS外,CAS(Column Address Strobe)也被處於是有效的狀態,不過此時用到的An位址線中,A10為特殊用途,用來指示Auto Precharge外,其餘的被拿來發送Column Address。這裡使用到的位址線數量我們可以得知該SDRAM具有多少Column。在這同時,Read和Write命令是透過/WE來分別的。
然而,在輸入read/write命令時必須要與ACT命令有一個間隔,這個間隔被定義為tRCD,即RAS to CAS Delay,這是根據chip內電子元件影響時間所制定的delay。tRCD是個重要的參數,在設定SDRAM Controller時必須特別注意。

4. Data Output (Read)
在選定Column Address後,就已經確定了具體的Cell,剩下的就是等Data通過I/O通道(DQ)輸出到腳位上。但是在CAS發出之後仍要經過一定的時間才能有Data輸出,這段時間被定義為CL(Cas Latency)。由於CL只在讀取時出現,所以CL又被稱為Read Latency(RL)。
其實,CAS並不是在經過CL後才送到Cell裡的。實際上CAS和RAS一樣,都是瞬間送到的。但由於Chip體積的原因,Cell中的電容容量很小,所以信號要經過放大來保證其有效的識別性,這個放大/驅動的工作由S-AMP負責。但它要有一個準備時間才能保證信號發送強度,這也是需要CL的原因。

5. Data Input (Write)
Data寫入的動作也是在tRCD之後進行的,不過此時沒有CL。由於Data Signal是由Controller發出,SDRAM只需將Data輸入到register中,然後再該Cell的儲存電容進行充電操作,因此Data可以與CAS同時發送,也就是說Write Delay為0。不過Data並不是即時地寫入儲存電容中,因為電容的充電都必須要有一段時間,所以Data的真正寫入需要一定的週期。為了保證Data的可靠寫入,都會留出足夠的tWR(Write Recovery Time)。tWR至少會佔用一個或一個以上的時間週期(頻率越高,佔用週期越多)。

6. Burst Length
Burst是指在同一Row中相鄰的Cell連續進行Data傳輸的方式,這樣連續傳輸所涉及到的Cell數量就是Burst Length(簡稱BL)。
因為就算連續的Read/Write命令可以讓Data的傳輸在I/O端是連續的,但它佔用了大量的Memory控制資源,在Data進行連續傳輸時無法輸入新的命令,效率很低。為此,開發了Burst傳輸技術,只要指定好起始的Column Address和BL,SDRAM就會依次地自動對後面相對應數量的Cell進行Read/Write操作,而不用再需要Controller提供Column Address。這樣除了第一筆Data傳輸需要tRCD+CL的Delay外,後面的每一個只需一個Clock即可獲得。
至於BL的數值,也不能隨便設或在要Read/Write前臨時決定。它是在一開始的Initialization Sequence時設定MRS時就設定好的。目前可用的選項有1、2、4、8、Full Page等,一般常見的是設為4或8。

7. Precharge
由於SDRAM的Addressing具有獨佔性,所以在進行Read/Write操作後,如果要對同一個Bank的另一個Row進行Addressing,就要將原本有效(Working)的Row關閉,重新發送Row/Column Address。Bank關閉現有Working Row,準備打開新的Row的操作就是Precharge。Precharge可以通過命令控制,也可以通過輔助設定讓SDRAM在每次Read/Write後自動進行Precharge(Auto Precharge)。
Precharge是一種對Working Row中所有的Cell進行Data重寫,並對Row Address進行回覆,同時釋放S-AMP,以準備新Row的工作。因為即使是沒有工作過的Cell也會因Row被選中而使Cell受到干擾,所以也需要S-AMP進行讀後回寫來保持Cell內電容的電壓,用以維持其邏輯值。邏輯值的判定,基本上是設定一個臨界值,一般是電容電量的1/2,超過它為邏輯1,S-AMP在回寫時會重寫;低於它為邏輯0,S-AMP不進行重寫(等於放電)。而釋放S-AMP就是重新加入比較電壓(即電容電壓的1/2),用以幫助S-AMP之後判斷讀取Data的邏輯電位。
上述提到的輔助控制即為An中的A10在Read/Write命令發送時,決定是否在Read/Write之後對當前的Bank進行Auto Precharge的動作。除了Auto Precharge功能外,在單獨的Precharge命令中,A10還控制著是否對單一Bank或全部的Bank做Precharge。在Precharge命令發出後,要經過一段時間才能允許發送ACT命令繼續新的Working Row,這個間隔被稱為tRP(Precharge command Period)。

8. Refresh
DRAM內部是許多電容所組成,它需要不斷的進行Refresh才能保持住Data,所以Refresh是DRAM中最重要的操作。Refresh和Precharge是一樣的,都是用S-AMP先讀後寫。但Precharge是對一個Bank或是所有Bank進行的不定期操作,所以還需要有固定週期依序對所有Row進行操作,以保持那些久久沒經歷重寫的Cell內的Data。
目前Cell中電容的Data有效保存上限公認的標準是64ms,也就是每一行的刷新循環週期是64ms。這樣刷新速度就是Row數量/64ms。在Data Sheet中,經常會看到4096 refresh cycles/64ms或8192 refresh cycles/64ms的標準,這裡4096或8192就代表這個SDRAM每個Bank中的Row數量。Refresh命令一次對一Row有效,所以發送間隔也是隨著Row數而變化,4096Row為15.625us,8192Row為7.8125us。
Refresh命令分為2種:Auto Refresh(REF)和Self Refresh(SREF)。不管是哪種Refresh,都不需要外部提供Row Address,因為這是一個內部的自動操作。對於REF,SDRAM內有一個Row Address Generator(也稱Refresh Counter)用來自動依次生成Row Address。由於Refresh是對所有Bank操作,所以在Refresh時所有的Bank都停止工作,而每次Refresh所佔用的時間為9個clock(PC133標準),這個時間稱為tARFC,之後才可以進入正常的工作狀態。而對於SREF則是主要用於休眠模式下的Data保持,在發出REF命令時,將CKE=Low就進入了SREF模式。此時不再依靠CLK工作,而是根據內部的CLK進行Refresh操作。在SREF期間,除了CKE之外的外部signal都是無效的,只有重新使CKE=High才能退出SREF模式。

9. Data Mask
上述提到Read/Write操作配合Burst Length可以一次傳送多筆Data。假設BL=4,也就是一次能傳送4x64bit的Data。但若我們只需比BL還少的Data時,,怎麼辦?此時就需要Data I/O Mask(DQM)技術。通過DQM,Controller可以控制I/O取消哪些Input或Output的Data。不過在Read時,被Mask掉的Data仍然會從SDRAM傳出,只是會被Mask Logic Unit處被Mask掉。DQM為了精確的Mask一個Bank位寬的每一個byte,每個DQM信號線針對一個byte。這樣對於4bit的Bank位寬的SDRAM,2個Chip共用一個DQM信號線,對於8bit的SDRAM,一個Chip佔用一個DQM信號線,而對於16bit的SDRAM,則需要2個DQM信號線。
SDRAM官方規定,在Read時,DQM發出2個clock後生效。而在Write時DQM與WR一樣是立即生效的。

[技術] 讓Linux支援Pentium-M 745 (含kernel compile)

Written on 10:55 下午 by Yu Lai

最近買了顆Intel Pentium-M 745 1.80G ES版的CPU來升級我的舊NB,T40。
但裝上後發現CPU只有跑到600Mhz,升級變成降級,囧rz~。
上網一查才發現,原來Linux Kernel裡的speedstep不支援我這顆CPU。
沒辦法,總不能一直跑在600Mhz吧,只好自己改Kernel source code支援它囉。

在Pentium-M的CPU中,無論是Banias或Dothan系列,
都可以透過軟體來控制它的電壓和頻率(透過MSR Register)。
在現行的Linux 2.6.32中,
是透過cpufreq_frequency_table來正確的設定其電壓和頻率。
但Linux Kernel source code裡並沒有把所有的Pentium-M CPU都列進去,
這也導致我的745不能跑全速的原因。
所以我要做的目的就是在source code裡加入745的cpufreq_frequency_table,
讓它能正確的跑到1.80GHz。

當然,解法不只一種,但幾乎都要Kernel,除了上述的方法外,有興趣的人可以參考以下的連結。
Ref: http://www.thinkwiki.org/wiki/Pentium_M_undervolting_and_underclocking
Ref: http://forum.thinkpads.com/viewtopic.php?p=296774

以下則是我修改的過程與筆記。
PS: 由於我的環境是Ubuntu,所以以下的方法是以Ubuntu的為主。

1. 因為要編kernel,所以先準備好以下工具。

apt-get install build-dep gcc
apt-get install kernel-package libncurses5-dev fakeroot wget bzip2

然後把kernel-source抓回來放到/usr/src下。

2. 把kernel source code解開,把 arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c 打開,
在適當位置定義要給745用的cpufreq_frequency_table,並把它設定到cpu_model models[]中。以下是diff檔。
227a228,240
> /* Intel Pentium M processor 745 / 1.80 GHz (Dothan) */
> static struct cpufreq_frequency_table sonoma_1800[] =
> {
> OPEX( 600, 100, 988, 988, 988, 988),
> OPEX( 800, 100, 1052, 1052, 1052, 1036),
> OPEX(1000, 100, 1116, 1100, 1100, 1084),
> OPEX(1200, 100, 1164, 1164, 1148, 1132),
> OPEX(1400, 100, 1228, 1212, 1212, 1180),
> OPEX(1600, 100, 1292, 1276, 1260, 1228),
> OPEX(1800, 100, 1340, 1324, 1308, 1276),
> { .frequency = CPUFREQ_TABLE_END }
> };
>
307a321
> SONOMA(&cpu_ids[CPU_DOTHAN_C0], 1800, 100, "1.80"),


3. 設定kernel/compile的configuration檔。
先把舊的config檔拿來用,至少不用改太多。
cp /boot/config-`uname -r` .config
make menuconfig
選"Load an Alternate Configuration File"把它載進來,再去修改設定。
這裡建議把Loacl version加進去,方便識別。
改完後存檔離開。

4. 編出kernel deb檔。
make-kpkg clean
fakeroot make-kpkg --initrd kernel_image kernel_headers
(這裡就先去泡茶或找些別的事來做吧,因為要花點時間XD。)

5. 安裝kernel deb檔。
編好後切回目錄/usr/src下,會看到多了2個linux-image-xxxx和linux-headers-xxx的deb檔。
dpkg -i linux-image-xxxx.deb
dpkg -i linux-headers-xxxx.deb
安裝完後,記得檢查一下/boot/grub/grub.cfg。

6. 重開機測試。
# cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
1800000
完成。

[技術] SVN merge筆記

Written on 4:57 下午 by Yu Lai

以下是這次使用的心得:

若有一個trunk,為了修一個 bug 建立另一個branches。
現在 bug 已經修正完畢,如何將修正後的 code 合併回trunk呢?

solution:
1. 先switch回trunk.
2. 使用svn log查出branches的起始版號.
3. svn merge -r [起始版號]:HEAD [branches url].
4. svn commit.

[技術] 各家Toolchains的比較

Written on 4:04 下午 by Yu Lai

一般而言,
在開發Embedded System時大都需要用到不同平台的cross-compiler與Toolchains。
而在elinux.org有一篇介紹各家Toolchains的文章,就轉來參考囉。

Ref: http://elinux.org/Toolchains

以下是常見的幾個Toolchains的說明:

CodeSourcery
CodeSourcery develops Sourcery G++, an Eclipse based Integrated Development Environment (IDE) that incorporates the GNU Toolchain (gcc, gdb, etc.) for cross development for numerous target architectures. CodeSourcery provides a "lite" version for ARM, Coldfire, MIPS, SuperH and Power architectures. The toolchains are always very up to date. CodeSourcery contributes enhancements it makes to the GNU Toolchain upstream continually, making it the single largest (by patch count) corporate contributor.

DENX ELDK
The DENX Embedded Linux Development Kit (ELDK) provides a complete and powerful software development environment for embedded and real-time systems. It is available for ARM, PowerPC and MIPS processors and consists of:
Cross Development Tools (Compiler, Assembler, Linker etc.) to develop software for the target system.
Native Tools (Shell, commands and libraries) which provide a standard Linux development environment that runs on the target system.
Firmware (U-Boot) that can be easily ported to new boards and processors.
Linux kernel including the complete source-code with all device drivers, board-support functions etc.
Xenomai - RTOS Emulation framework for systems requiring hard real-time responses.
SELF (Simple Embedded Linux Framework) as fundament to build your embedded systems on.
All components of the ELDK are available for free with complete source code under GPL and other Free Software Licenses. Also, detailed instructions to rebuild all the tools and packages from scratch are included.
The ELDK can be downloaded for free from several mirror sites or ordered on CD-ROM for a nominal charge (99 Euro). To order the CD please contact office@denx.de
Detailed information about the ELDK is available here.

Buildroot
Buildroot is a complete build system based on the Linux Kernel configuration system and supports a wide range of target architectures. It generates root file system images ready to be written to flash. In addition to having a huge number of packages which can be compiled into the image, it also generates a cross toolchain to build those packages from source. Even if you don't want to use buildroot for your root filesystem, it is a useful tool for generating a toolchain. It should be noted however that it only supports uClibc. If you want to use glibc, you'll need something else.

[技術] Linux下使用Minicon+Kermit

Written on 10:41 上午 by Yu Lai

這陣子接了新的板子的開發,由於H/W的關係,
加上JTAG數量有限,所以只能先用RS-232來傳image到板子上run。

目前板子上的Loader為舊版本的u-boot,它只有支援Kermit protocol來傳輸。
說到Kermit,在Windows下有名的TeraTerm的檔案傳送功也有支援kermit protocol。
以下就是我在Linux下使用Minicom+Kermit的心得整理;

1. 安裝minicom和ckermit
請先透過apt-get或Synaptic把minicom和ckermit裝起來。

2. 配置ckermit的設定檔
將以下內容放在~/.kermrc裡.
set carrier-watch off
set prefixing all
set parity none
set stop-bits 1
set modem none
set file type bin
set file name lit
set flow-control none
set prompt "Linux Kermit> "

3. 配置minicom
使用minicom -s,到"檔案傳輸協定"或"File Transfer protocols"裡的G和H,
G設定為/usr/bin/kermit -i -l %f -b %b -s Y U Y N N,
H設定為/usr/bin/kermit -i -l %f -b %b -r N D Y N N。

4. 開始傳檔
執行Ctrl+A -> S,接著選完檔案後即可開始傳送檔案了。

PS1:
以上minicom的設定,
可以使用Ctrl+A -> O裡的"儲存設定",
這樣就不用每次都重新設定了。

PS2:
一般而言除了Kermit外,
常見的還有使用x-modem, y-modem或z-modem protocol來傳送。
而minicom都可以配合外掛程式來達到此功能。

[企管] [轉錄]企業常用的縮寫

Written on 11:07 上午 by Yu Lai

From: http://wiki.planetoid.info/index.php/%E4%BC%81%E6%A5%AD%E5%B8%B8%E7%94%A8%E7%9A%84%E7%B8%AE%E5%AF%AB

5S 5S管理
ABC 作業製成本制度 (Activity-Based Costing)
ABB 實施作業制預算制度 (Activity-Based Budgeting)
ABM 作業製成本管理 (Activity-Base Management) (see cost management)
APS 先進規畫與排程系統 (Advanced Planning and Scheduling)
ASP 應用程式服務供應商(Application Service Provider)
ATP 可承諾量 (Available To Promise)
AVL 認可的供應商清單(Approved Vendor List)
BOM 物料清單 (Bill Of Material)
BPR 企業流程再造 (Business Process Reengineering)
BSC 平衡記分卡 (Balanced ScoreCard)
BTF 計劃生產 (Build To Forecast)
BTO 訂單生產 (Build To Order)
CPM 要徑法 (Critical Path Method)
CPM 每一百萬個使用者會有幾次抱怨(Complaint per Million)
CRM 客戶關係管理 (Customer Relationship Management)
CRP 產能需求規劃 (Capacity Requirements Planning)
CTO 客製化生產 (Configuration To Order)
DBR 限制驅導式排程法 (Drum-Buffer-Rope)
DMT 成熟度驗證(Design Maturing Testing)
DVT 設計驗證(Design Verification Testing)
DRP 運銷資源計劃 (Distribution Resource Planning)
DSS 決策支援系統 (Decision Support System)
EC 設計變更/工程變更 (Engineer Change)
EC 電子商務 (Electronic Commerce)
ECM 企業內容管理(Enterprise content management)
ECRN 原件規格更改通知(Engineer Change Request Notice)
EDI 電子資料交換 (Electronic Data Interchange)
EIS 主管決策系統 (Executive Information System)
EMC 電磁相容(Electric Magnetic Capability)
EOQ 基本經濟訂購量 (Economic Order Quantity)
ERP 企業資源規劃 (Enterprise Resource Planning)
FAE 應用工程師(Field Application Engineer)
FCST 預估(Forecast)
FMS 彈性製造系統 (Flexible Manufacture System)
FQC 成品品質管制 (Finish or Final Quality Control)
IPQC 製程品質管制 (In-Process Quality Control)
IQC 進料品質管制 (Incoming Quality Control)
ISO 國際標準組織 (International Organization for Standardization)
ISAR 首批樣品認可(Initial Sample Approval Request)
JIT 即時管理 (Just In Time)
KM 知識管理 (Knowledge Management)
L4L 逐批訂購法 (Lot-for-Lot)
LTC 最小總成本法 (Least Total Cost)
LUC 最小單位成本 (Least Unit Cost)
MES 製造執行系統 (Manufacturing Execution System)
MO 製令(Manufacture Order)
MPS 主生產排程 (Master Production Schedule)
MRO 請修(購)單(Maintenance Repair Operation)
MRP 物料需求規劃 (Material Requirement Planning)
MRPII 製造資源計劃 (Manufacturing Resource Planning)
NFCF 更改預估量的通知(Notice for Changing Forecast)
OEM 委託代工 (Original Equipment Manufacture)
ODM 委託設計與製造 (Original Design & Manufacture)
OLAP 線上分析處理 (On-Line Analytical Processing)
OLTP 線上交易處理 (On-Line Transaction Processing)
OPT 最佳生產技術 (Optimized Production Technology)
OQC 出貨品質管制 (Out-going Quality Control)
PDCA PDCA管理循環 (Plan-Do-Check-Action)
PDM 產品資料管理系統 (Product Data Management)
PERT 計畫評核術 (Program Evaluation and Review Technique)
PO 訂單(Purchase Order)
POH 預估在手量 (Product on Hand)
PR 採購申請(Purchase Request)
QA 品質保證(Quality Assurance) see also Quality control
QC 品質管制(Quality Control)
QCC 品管圈 (Quality Control Circle)
QE 品質工程(Quality Engineering)
RCCP 粗略產能規劃 (Rough Cut Capacity Planning)
RMA 退貨驗收(Returned Material Approval)
ROP 再訂購點 (Re-Order Point)
SCM 供應鏈管理 (Supply Chain Management)
SFC 現場控制 (Shop Floor Control)
SIS 策略資訊系統 (Strategic Information System)
SO 訂單(Sales Order)
SOR 特殊訂單需求(Special Order Request)
SOW 工作說明書(Statement of work)
SPC 統計製程管制 (Statistic Process Control)
TCO 整體擁有成本(Total cost of ownership)
TOC 限制理論 (Theory of Constraints)
TPM 全面生產管理(Total Production Management)
TQC 全面品質管制 (Total Quality Control)
TQM 全面品質管理 (Total Quality Management)
WIP 在製品 (Work In Process)

[技術] [轉錄]Android 內核的簡單分析

Written on 1:38 上午 by Yu Lai

From: http://www.cnmsdn.com/html/201002/1266986960ID865.html

在kernel子目錄下存放的就是Android的Linux Kernel了, 通過和標準的Linux 2.6.25 Kernel的對比,我們可以發現,其主要增加了以下的內容:

  1. 基於ARM架構增加Gold-Fish平台,相應增加的目錄如下:

  kernel/arch/arm/mach-goldfish

  kernel/include/asm-arm/arch-goldfish

  Gold-Fish平台採用的是ARM926T CPU作為BaseBand處理器, 該CPU主頻至少為200M HZ. 採用MSM7201A CPU(ARM 11)作為主CPU, 其主頻為528M HZ.

  2. 增加了yaffs2 FLASH文件系統,相應增加的目錄為:

  kernel/fs/yaffs2

  實際上,Android包經過編譯後生成的system.img和ramdisk.img文件就是yaffs2格式的包.

  3. 增加了Android的相關Driver,相應目錄為:

  kernel/drivers/android

  主要分為:

  Android IPC系統: Binder

  Android 日誌系統: Logger

  Android 電源管理: Power

  Android 鬧鐘管理: Alarm

  Android 內存控制台: Ram_console

  Android 時鐘控制的gpio: Timed_gpio

  4. 增加了switch處理, 相應的目錄為:

  kernel/drivers/switch/

  5. 增加了一種新的共享內存處理方式, 相應增加的文件為:

  kernel/mm/ashmem.c

  6. 其他為Linux-2.6.25內核所做的補丁等等,例如BlueTooth, 在此不做詳細分析

  另外GoldFish平台相關的驅動文件如下:

  1. 字符輸出設備:

  kernel/drivers/char/goldfish_tty.c

  2. 圖像顯示設備: (Frame Buffer)

  kernel/drivers/video/goldfishfb.c

  3. 鍵盤輸入設備:

  kernel/drivers/input/keyboard/goldfish_events.c

  4. RTC設備: (Real Time Clock)

  kernel/drivers/rtc/rtc-goldfish.c

  . USB Device設備:

  kernel/drivers/usb/gadget/android_adb.c

  6. SD卡設備:

  kernel/drivers/mmc/host/goldfish.c

  7. FLASH設備:

  kernel/drivers/mtd/devices/goldfish_nand.c

  kernel/drivers/mtd/devices/goldfish_nand_reg.h

  8. LED設備:

  kernel/drivers/leds/ledtrig-sleep.c

  9. 電源設備:

  kernel/drivers/power/goldfish_battery.c

  10. 音頻設備:

  kernel/arch/arm/mach-goldfish/audio.c

  11. 電源管理:

  kernel/arch/arm/mach-goldfish/pm.c

  12. 時鐘管理:

  kernel/arch/arm/mach-goldfish/timer.c

[技術] Milestone的鬧鐘問題

Written on 12:47 上午 by Yu Lai

Milestone從原本都很正常work的鬧鐘,
從我出差來泰國後, 沒有插著AC充睡覺就開始怪怪的.
後來花了點時間去trace, 才發現原來RTC的interrupt在2.1的firmware被改濫了.
還好有人把新版本的kernel從新的加拿大版的firmware取出來做成SBF.

Ref From: http://and-developers.com/motorola_milestone:sbf

2.1 kernel fix of scheduled CPU wake-ups

This SBF file will flash only the boot.img (kernel+init) from SHOLS_U2_03.10.0: mediafire, rapidshare

It will fix the broken scheduling of Alarm/RTC interrupts on the SHOLS_U2_02.31 and
SHOLS_U2_02.34 systems (kernel problem - alarms delayed).


升級前先把Kernel的版號記錄一下:
2.6.29-omap1 a21146@ca25rhe74 #1

透過上一篇提到的sbf_flash指令,把kernel更新後,版號變成如下:
2.6.29-omap1 rkg683@ca25rhe56 #1

應該是有更新成功吧,就看這幾天鬧鐘正不正常囉。

[技術] Milestone上SBF和RSD Lite說明

Written on 12:01 上午 by Yu Lai

之前在root Milestone時有使用到的SBF以及RSD Lite,
這陣子有把資料找全了,在這裡重新說明一下用以備忘。

首先SBF是Single Binary File的縮寫,
它是包含了要燒錄的binary data和checksum資料等。
提供給RSD介面燒錄資料到device上。
除了Motorola官方提供的SBF可供燒錄外,
我們也可以透過SBF-Recalc自行產生出可燒錄的SBF檔。
Ref: http://and-developers.com/motorola_milestone:sbf

而講到RSD Lite就要先講一下RSD,
RSD是Remote Software Download的縮寫,
它是Motorola開發出來用來做為遠端燒錄flash的介面,
也就是說只有Motorola的device才會用到的東東。
而目前使用到RSD的軟體有:
RSD-NetConnected
RSD Lite
Motorola Software Updater
RSD-NPI

目前RSD Lite只有Windows版本,若要在Linux下使用不太方便。
於是有網友[mbm]提供了一個Linux程式sbf_flash,有興趣可以到這裡看看。
Ref:http://and-developers.com/motorola_milestone:tools:rsd_lite

[技術] Linux Kernel的schedule_timeout error

Written on 4:45 下午 by Yu Lai

今天在寫Code時,Kernel狂吐schedule_timeout: wrong timeout value fffffd85 from c01595ef。
查了一下Google才發現這是說schedule_timeout被傳了負數的value進去導致的錯誤。
到/proc/ksyms或System.map一查才發現原來是epoll所呼叫的。
比對了一下code才發現原來忘了對timeout variable進行initial與小於0的check,修正後即解決。

[技術] Milestone上安裝Busybox

Written on 1:09 下午 by Yu Lai

最近在Milestone上玩起adb和Terminal,發現原有的shell真的難用到爆,
再加上一堆指令不內建,於是想自己編busybox來用用。

首先先搞定Milestone的Cross-Compiler,不外乎以下幾種方法:
1. 自己手動抓binutil, gcc等回來自己慢慢編成target=ARM。(PS:會很慢)
2. 到Android Open Source Project的網站抓prebuilt.git裡編好的toolchain。
http://android.git.kernel.org/?p=platform/prebuilt.git;a=tree;f=linux-x86/toolchain/arm-eabi-4.4.0;
點選snapshot即可下載,大概是74mb左右.我是抓arm-eabi-4.4.0的。
3. 到CodeSourcery抓Sourcery G++ Lite Edition for ARM
http://www.codesourcery.com/sgpp/lite/arm點選Download。

接著去抓busybox的原始碼回來,解開後先按make menuconfig進選單,
此時記得把cross-compiler的位置指定好,
同時把Build BusyBox as a static binary (no shared libs)勾選起來。
其實勾選static binary是比較花code size的,但沒辦法,
懶得hack busybox去配合Bionic Libc,要花太多effert。
所幸編出來的code size也不至於爆肥到哪去 XD。
接著把要編出來的applet選好,存好後敲make開始編囉。

編出busybox後,由於Android內的/system預設是read-only的,
所以我們使用adb push的方式先將busybox丟到/data下。
./adb push busybox /data
接著使用adb shell操作把/system重新mount再把busybox丟過去。
./adb shell
$ su <- 變root
# mount -o rw,remount -t yaffs2 /dev/block/mtdblock6 /system
# cd /data
# chmod +x busybox
# ./busybox cp busybox /system/xbin <- 因為內建的cp難用
# cd /system/xbin
# ./busybox --install <- 安裝links
# cd /data
# rm busybox
# mount -o ro,remount -t yaffs2 /dev/block/mtdblock6 /system
# exit
$ exit

接著就可以使用到busybox所提供強大的功能啦 :)

Milestone 2.1 root心得

Written on 10:10 上午 by Yu Lai

其實拿到手機第二天就被我root了。 XD
只是我這陣子忙著弄rstp到現在才有空把這些資訊整理出來。

首先Milestone的Boot Loader除了原本Loader的功能(Load Kernel & FS then Go)外,
還具有2個特別的功能:
  1. Program SBF file。
  這個功能是Loader提供了一個介面,讓安裝了RSD Lite的PC透過USB連接線,
  直接將Image(SBF file)直接燒錄到Milestone的flash裡。
  這裡有官方提供的SBF檔,請小心對應版本。
  http://and-developers.com/motorola_milestone:sbf

  2. Recovery Mode.
  這裡提供Apply sdcard:update.zip與factory reset等功能。

而在2.0.1版本前取root的方法不外乎進Loader的Recovery Mode,
將su與Superuser.apk包成update.zip的方式更新到系統中。
但Motorola官方釋出了Milestone 2.1的更新版中的Recovery mode已經使用新的簽證,
所以無法再繼續使用以前的update.zip來騙過系統作假更新,
也就是不吃使用者自訂的update.zip,這導致無法透過此方法取得root。

沒關係,山不轉路轉,既然新的Recovery Mode不能用,我們就把它更新回舊的。
網路上有人把2.0.1的Recovery Mode從2.0.1的更新檔中抽出來并包裝成SBF檔提供使用。
檔案在此:SHOLS_U2_01.14.0_recovery_only.zip (mediafile)或(bandongo)。

接著去下載Motorola工程師專用的RSD Lit軟件並安裝到Windows內,
http://www.multiupload.com/SIYSOH7VTU

然後如果沒有安裝Motorola USB driver,
請先安裝: Windows 32-bit Driver / Windows 64-bit Driver

接著先把Milestone關機,接上USB連接線,把鍵盤推開,
按住"上"鍵不放再按電源鍵啟動Milestone。
等到出現Bootloader裡面後,在Windows裡開啟已安裝的Motorola RSD Lite。
接著在RSD Lite軟件上的Filename裡按 [...],指定剛下載的SBF檔案,
然後按[Start]開始還原,待還原程序完成100%時,手機就會自動重啟。
此時你的Milestone就會具有2.1的System與2.0.1的Recovery Mode。

再來去下載milestone_root.zip到電腦裡,http://www.sendspace.com/file/5cvh9e
把檔名改為update.zip放到Micro SD Card的根目錄 / 內。
接著進到Recovey Mode,有2個方法:
  1. 先關閉milestone電源,然後推開鍵盤,按住"上"鍵不放再按電源鍵啟動Milestone,
  直到看見白色三角形標置。此時可放開按鈕,再長按"音量增大鍵"+"照相鍵"一下,
  便進入了 Recovery Mode。
  2. 使用Android Debuging Bridge Tool (adb tool),# adb reboot recovery。

Recovey Mode用鍵盤的5方向鍵選到Apply SDcard: Update.zip按下去執行等到
"Install from sd card complete"字句出現。接著選擇"Reboot system now"重啟Milestone,
待開完機後檢查app裡有沒有"Superuser whitelist"存在即可知道有否root成功。

[閒聊] 新玩具-Motorola Milestone

Written on 9:15 上午 by Yu Lai

哇哈哈,昨天去敗家了。
敗了一台Moto的Milestone回來,
Android機器人我來啦~。

[技術] 在Linux中透過ioctl來設定ARP Table

Written on 11:39 上午 by Yu Lai

一般我們在Linux上可以使用arp這個指令來顯示或設定ARP Table。
而在程式中如果要操作系統的ARP Table的話,除了用system()來呼叫
arp指令外,也可以透過socket fd所提供的ioctl命令來達成,共有3種,
分別是SIOCSARP(設定ARP mapping),SIOCDARP(刪除ARP mapping),
SIOCGARP(獲取ARP mapping)。在操作上需配合struct arpreq,
定義如下:

struct arpreq {
struct sockaddr arp_pa; /* protocol address */
struct sockaddr arp_ha; /* hardware address */
int arp_flags; /* flags */
struct sockaddr arp_netmask; /* netmask of protocol address */
char arp_dev[16];
};


其中,arp_pa必須是AF_INET的socket。而指定的network device
也必須填入arp_dev中。而arp_flag的value定義如下:
ATF_COM = Lookup complete
ATF_PERM = Permanent entry
ATF_PUBL = Publish entry
ATF_USETRAILERS = Trailers requested
ATF_NETMASK = Use a netmask
ATF_DONTPUB = Don't answer

使用SIOCSARP命令時,需設定arpreq的arp_pa,arp_ha和arp_flags。
此時若ARP Table己經存在這筆IP位址,它會將它取出更新。若不存在,則新增。

使用SIOCDARP命令時,只需設定arpreq中的arp_pa和arp_dev,kernel會
根據arp_pa的IP位址從ARP Table的hash中取出,並將其state更新為NUD_FAILED。
這樣在下一次ARP GC時就會被清掉。

使用SIOCGARP命令時,只需要設定arpreq中的arp_pa即可。不過一般我們
不會透過SIOCGARP命令,而是使用/proc/net/arp直接讀取。

以下是SIOCSARP的範例程式:
#include <sys/ioctl.h> 
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/if_ether.h>
#include <netinet/in.h>

int set_arp(char * ip, char * mac, char * dev) {

struct arpreq req;
struct sockaddr_in addr;
int sockfd, rc;
unsigned int s_addr;

sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0) {
return 1;
}

/* Inet sockaddr_in struct */
memset(&addr, 0, sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(ip);

/* ARP arpreq struct */
memset(&req, 0, sizeof(req));
memcpy(&req.arp_pa, &addr, sizeof(struct sockaddr));
memcpy(req.arp_ha.sa_data, mac, 6);
req.arp_flags = ATF_PERM | ATF_COM;
strcpy(req.arp_dev, dev);

rc = ioctl(sockfd, SIOCSARP, &req);
close(sockfd);

return rc;

}