Written on 11:31 下午 by Yu Lai
一般來說,刷機步驟如下:
1. 進入Recovery Mode。
2. 啟動Open Recovery。
3. 從OpenRecovery裡安裝ROM與Google Apps。
4. wipe & Reboot。
一般來說,Milestone要刷機主要是透過Open Recovery來幫忙,
使用Open Recovery幫我們省掉不少的麻煩與風險。
要使用Open Recovery,我們要先能進Recovery Mode才行。
如果Milestone進不去Recovery Mode,那請先到http://and-developers.com/sbf
抓一版官方版的ROM,使用SBF燒錄進去,再安裝Vulnerable Recovery SBF Flash即可。
接著把Open Recovery的解開,全部放到記憶卡中,長這樣:
/SDCARD/OpenRecovery 和 /SDCARD/update.zip。
然後把ROM檔與Google Apps也放到/SDCARD/OpenRecovery/updates裡.
再來按著X開機,等到三角型圖示出來,按著音量鍵上+相機鍵進入Recovery Mode,
若已經是CM的ROM,可以直接用Reboot -> Recovery進去Recovery Mode,
進去後選Apply update.zip就可以進到Open Recovery。
在Open Recovery裡和剛才一樣,選Apply Update,然後選ROM檔安裝,
接著再選Google Apps安裝。
都裝完後記得要wipe,按下Go back,分別執行三個選項:
Wipe Dalvik Cache、Wipe Data/Factory Reset、Wipe Cache Partition,
這三個步驟俗稱3Wipe,在刷機完後都一定要清除所有的個人資料,以便新系統穩定。
Posted in
技術,
Android
|
Written on 12:32 上午 by Yu Lai
最近需要和國外的客戶合作,
期間有用到PGP的加密來傳送機密文件,用的就是PGP。
PGP是一種混合密碼系統,它結合了傳統密碼法和公開金鑰密碼法的多種最棒的特色。
在加密時,PGP會產生一個階段金鑰,這把階段金鑰是一種只有當時有效的秘密金鑰,
是利用任意的滑鼠移動以及鍵盤輸入所產生的亂數。
它以非常秘密而快速的傳統加密演算法來加密純文字,而產生出密文。
當資料加密完成後,這把階段金鑰接著就會開始以收信者的公鑰被加密。
這個被公鑰加密過的階段金鑰將會與密文一併交付給收信者。
解密的過程就是反向運作了。
收信者的PGP會利用他的私鑰來還原那把暫時的階段金鑰,
然後PGP再利用這把階段金鑰來將傳統加密過的密文解密。
在此我用的是Gnu所提供的GnuPG,
GnuPG是GNU由RFC4880所訂出來的OpenPGP的實做。
以下是GnuPG在使用上的說明。
1. 產生鑰匙:
gpg --gen-key
一開始一定沒有自己的一對公私鑰,我們可以透過--gen-key來產生。
2. 輸出鑰匙:
gpg -a -o [Filename] --export [USERID]
其中-a是指輸出成ASCII格式,-o則是指定輸出到檔案,
--export則是將[USERID]的公鑰輸出。
一般我們是將一開始產生出來的公私鑰的公鑰export出檔案來,
然後就可以將公鑰傳送給別人了。
3. 輸入鑰匙
gpg --import [Filename]
當你收到一把別人的公鑰(或好幾把公鑰)時,為了能使用它們,
你得把它們加進你的鑰匙數據庫。
4. 列出公鑰
gpg --list-keys
5. 列出私鑰
gpg --list-secret-keys
6. 刪除公鑰
gpg --delete-key [USERID]
7. 刪除私鑰
gpg --delete-secret-key [USERID]
8. 鑰匙簽名
gpg --sign-key [USERID]
PGP在使用上有一個最大的弱點,那就是公鑰的真實性問題。
如果用的是錯誤的公鑰,你加密的價值就全沒了。
要克服這種風險,必須確信這把鑰匙是真實的,並在上面簽名,
簽名就表示承認鑰匙上的用戶身份確實是這把鑰匙的主人。
9. 加密
gpg -r [Recipient] -e [filename]
系統會用[Recipient]的公鑰對[filename]這個檔案加密,
並產生出[filename].pgp檔來。
這樣[Recipient]即可用自己的私鑰進行解密的動作,
還原出檔案來。
10. 解密
gpg -d [filename].pgp
當你收到別人用你的公鑰加密的檔案時,即可用-d來進行解密,
還原出檔案來。
Posted in
技術,
Encryption,
GnuPG,
PGP,
Security
|
Written on 12:18 上午 by Yu Lai
Ref: http://msnlite.org/thread-365-1-1.html
C++是使用pointer來靈活方便地控制memory與instance的,這是它強大的原因之一,
但它缺乏像Java一樣的Garbage Collector機制來回收instance,
因此Programmer必須要自己手動delete掉new出來的instance。
這在軟體規模小的時候還好,但在規模大、多人協同工作、多線程環境加入時,
往往memory與instance的分配和釋放變的越來越難控制。
因此Boost C++ Libraries提供了shared_ptr,
shared_ptr實際上是一個Template Class,
透過instance成不同Class,為Class提供Pointer操作。
例如:
shared_ptr<int> p1(new int);
shared_ptr<int> p2=p1;
這樣p1和p2都可以point到int。
shared_ptr Class內有2個variable,一個是原始pointer,
可以用get()取得,用reset(T* p)可以重新設置。
另一個是instance的引用次數,其值可以用use_count()獲得。
它會隨著引用的shared_ptr來增加,當shared_ptr銷毀時,
引用次數也會減少,當減少到0時,shared_ptr會呼叫delete function來delete instance。
使用方法:
shared_ptr<Object> p1(new Object); //Use constructor
shared_ptr<Object> p2=p1; //assign
shared_ptr<Object> p3.reset(p1); //reset function
p1.reset(); //放棄引用
另外shared_ptr也可以配合malloc()來使用,但這樣point到的空間沒辦法被正常釋放掉,
必須額外定義delete function才行,malloc()的delete function即為free()。
所以使用如下:
shared_ptr p(malloc(100),free);
最後,我想坦白說句我心理的話: "C++搞成這樣,實在只是讓人覺得更難用而已。= ="
Posted in
技術,
C++,
Java
|
Written on 3:25 下午 by Yu Lai
其實Squashfs已經用一陣子了,在用它之前是使用initramfs。
和initramfs相比,Squashfs較不佔記憶體的空間,
因為它是可以跑在mtd上的唯讀型壓縮檔案系統。
但也因為是唯讀的,所以在使用上仍需另外配置ramfs來提供Linux使用。
另外,initramfs和Kernel是包成同一個image的,而Squashfs是分開的。
Squashfs是一套供Linux核心使用的GPL開源唯讀壓縮檔案系統。
Squashfs能夠為檔案系統內的檔案、inode及目錄結構進行壓縮,
並支援最大1024千位元組的區段,以提供更大的壓縮比,
標準版的Squashfs採用gzip的數據壓縮。
Squashfs可以至http://squashfs.sourceforge.net/下載。
目前最新的是4.1版,是提供給Linux Kernel 2.6.29版本使用。
若使用較舊版本的Linux Kernel,請改用3.4版本。
以下是安裝Note,寫的有點亂,請見諒。
另外可以參考SquashFS HOWTO。
1. 裝Linux Kernel上SquashFS patch。
# cd /opt/linux-2.6.xx
# patch -p1 < /opt/squashfs/kernel-patches/linux-2.6.xx/squashfs3.4-patch
2. 修改MTD配置,在Flash上配置出Kernel和Squashfs的partition出來。
(在此共切4個Partition,分別是0-Bootloader, 1-Kernel, 2-Rootfs, 3-Other)
若已經調整好或是使用類似Redboot的fis,可跳過這段。
3. 編Linux Kernel。
# make distclean
# make mrproper
# make menuconfig
在File systems->Miscellaneous file systems將Squashed filesystem啟動(bundled with the kernel)。
# make
4. 編出SquashFS tools (mksquashfs)。
# cd /opt/squashfs/squashfs-tools
# make
5. 將root file system透過mksquashfs來產生image。
# mksquashfs ./root_file_system rootfs.bin
6. 在Loader上用tftp把rootfs.bin載入後燒錄到Partition Rootfs對應在Flash上的Address。
e.g. # flash 0x00100000 0x80100000
7. 修改kernel command line。
請改成 "console=ttyS0 root=/dev/mtdblock2 rootfstype=squashfs"
PS1:
在root file system裡的/etc/fstab裡可加入
ramfs /tmp ramfs defaults 0 0,避免Linux無寫入的File System可以使用。
PS2:
配合mtd,在Linux下亦可以透過mtd tools直接upgrade root file system。
# flash_eraseall /dev/mtd2
# flashcp -v rootfs.bin /dev/mtd2
Posted in
技術,
Embedded,
File System,
Linux,
MTD
|
Written on 2:16 下午 by Yu Lai
最近工作上需要在嵌入式系統中加入SSH Server,本來是要使用OpenSSH,
但Code size差太大(1.4M vs 170K),於是改用了Dropbear。
載點: http://matt.ucc.asn.au/dropbear/dropbear.html
以下是安裝方法:
# ./configure --host=mips-linux --disable-zlib
# make
編譯完後會產生出以下的執行檔:
1. dropbear : SSH Server
2. dbclient : SSH Client
3. dropbearkey : Key Generator
4. dropbearconvert : OpenSSH Key Convertor
在使用上記得要有host key,才能執行dropbear,沒有的要請透過dropbearkey來產生。
# dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key
# dropbear
Posted in
技術,
Embedded,
SSH
|
Written on 11:55 上午 by Yu Lai
距離上次使用CVS已經是大學時代了,
後來都是改用subversion來處理Version Control。
現在工作上又需要用到CVS,整理一下當成備忘吧。
1. 設定 CVSROOT
$ export CVSROOT=:pserver:id@cvs.server:/var/cvsroot
2. 下載原始碼 (checkout)
$ cvs login
CVS password: (在這裡輸入密碼)
$ cvs -z5 co
3. 更新原始碼 (update)
$ cvs update -dP
4. 提交修改 (commit)
$ cvs commit
5. 新增目錄 (add)
$ mkdir foo
$ cvs add foo
6. 新增檔案 (add)
$ cvs add myfile.c
7. 遞迴新增目錄
由於cvs在這方面不像svn一樣,直接對主目錄做add就好。
它要先將目錄先add後才能對檔案做add。
$ find -type d -print | grep -v CVS | xargs cvs add
$ find -type f -print | grep -v CVS | xargs cvs add
8. 移除檔案 (remove)
$ rm myoldfile.c
$ cvs remove myoldfile.c
9. 移除目錄 (remove)
$ rm *.c
$ cvs remove
$ cvs commit
$ cd ..
$ cvs remove mydir
$ rm -rf mydir
10. .cvsrc 檔案
設定一系列 cvs 命令有用的參數,建議如下:
cvs -q
diff -u -b -B
checkout -P
update -d -P
Posted in
技術,
cvs
|
Written on 8:48 下午 by Yu Lai
就在今天2011/01/21,我退伍啦。
下禮拜就是新的挑戰的開始了,Hala Lazyf。
Posted in
閒聊
|
Written on 12:41 下午 by Yu Lai
最近工作上玩到的,總結一下當Note吧。
主要是Ref: Serial Programming Guide for POSIX Operating Systems。
配合pthread把收跟送的部份分開,
以下是收的部份。
struct tty_q {
int len;
unsigned char buff[TTY_Q_SZ]; /* TTY_Q_SZ=1024 */
} tty_q;
int tty_fd;
pthread_mutex_t tty_mutex;
void * rs232com(void *arg) {
int c=0, len;
struct termios oldtio, newtio;
char buf[256];
pthread_detach(pthread_self());
pthread_mutex_init(&tty_mutex, NULL);
/* Open the rs232 port */
tty_fd = open(TTYDEVICE, O_RDWR|O_NOCTTY);
if (tty_fd < 0) {
perror(TTYDEVICE);
exit(1);
}
/* Get the current options */
tcgetattr(tty_fd, &oldtio);
/* Set new options */
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = BAUDRATE|CS8|CLOCAL|CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag = ICANON;
/* Set the options */
tcflush(tty_fd, TCIFLUSH);
tcsetattr(tty_fd, TCSANOW, &newtio);
while(1) {
len = read(tty_fd, buf, 255);
buf[len]=0;
MCP_LOG("RS-232 recv, len=%03d, buf=%s\n", len, buf);
pthread_mutex_lock(&tty_mutex);
if(tty_q.len + len > TTY_Q_SZ) {
memset(tty_q.buff, 0, TTY_Q_SZ);
tty_q.len = 0;
}
memcpy(&tty_q.buff[tty_q.len], buf, len);
tty_q.len += len;
pthread_mutex_unlock(&tty_mutex);
}
}
而送的部份在這裡。
int rs232send(U8 * buf) {
pthread_mutex_lock(&tty_mutex);
memset(tty_q.buff, 0, TTY_Q_SZ);
tty_q.len = 0;
pthread_mutex_unlock(&tty_mutex);
return write(tty_fd, buf, strlen(buf));
}
Posted in
技術,
C,
Linux,
RS-232
|