ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2013年3月21日 星期四

androd init - keyword.h & define

android 的 system/core/init/init_parset.c 有一種寫法,讓人找不到 code: #include "keywords.h" #define KEYWORD(symbol, flags, nargs, func) \ [ K_##symbol ] = { #symbol, func, nargs + 1, flags, }, struct { const char *name; int (*func)(int nargs, char **args); unsigned char nargs; unsigned char flags; } keyword_info[KEYWORD_COUNT] = { [ K_UNKNOWN ] = { "unknown", 0, 0, 0 }, #include "keywords.h" };

include "keywords.h" 兩次。

keywords.h 是這樣: #ifndef KEYWORD int do_chroot(int nargs, char **args); int do_chdir(int nargs, char **args); int do_class_start(int nargs, char **args); ... #define __MAKE_KEYWORD_ENUM__ #define KEYWORD(symbol, flags, nargs, func) K_##symbol, enum { K_UNKNOWN, #endif KEYWORD(capability, OPTION, 0, 0) KEYWORD(chdir, COMMAND, 1, do_chdir) KEYWORD(chroot, COMMAND, 1, do_chroot) ... #ifdef __MAKE_KEYWORD_ENUM__ KEYWORD_COUNT, }; #undef __MAKE_KEYWORD_ENUM__ #undef KEYWORD #endif

根據有沒有 define KEYWORD,有不同的地方。

這是想要用同一個宣告(定義),同時做出 enum constant 和 struction 宣告的關係。
所以第一個 include 時,會define KEYWORD,只做 enum 的 constant。

第二次 include 時,就會先重新define KEYWORD,作出正確的 key-function pair。

-- 可能很方便,但是讀 code 的人會不好找..

2013年3月19日 星期二

dalvik & preload classes

第一個 Zygote 啟動時,先 preload 大多數需要的 class 進 ram 裡。
之後 收到 socket 的 command 再 fork 一個 process 來啟動一個 activity,
所以那個 activity 啟動的時候,所有的 class 都已經 load 好了---

又因為 linux fork 的動作只是把 memory map 到 fork 的 process,
並沒有作 copy memory ,所以 fork 超快。

綜合以上兩點,preload class 可以減少"實體"記憶體的使用,同時也以加快 activity 啟動的速度。
缺點就是 啟動的時間會變慢。

-- 變慢這一點是值得懷疑的,因為即使 dalvik 啟動時不 preload,第一個 activity 啟動時,還是要 load 這些 class 呀。

Android 的 各種 error log

這篇有各level 當機的 log 位置 http://swverification.blog.sohu.com/141315680.html


節錄一下:
总结:
如果是用户程序Exception或者Dalvik Error Invoking Runtime都会通过AcitivityMangerService发出SIGQUIT信号给process,
再调用SignalCatcher.c再把crashed process信息放在/data/anr/traces.txt里面。

如果是SYSTEM process????或者通过Log.e(TAG,str,trowable)会直接报告exception到logcat里面。

如果是Dalvik Error, Invoking debuggerd/C code/LibC Error, 会调用Tombstone,然后把信息打印到/data/tombstones目录里面。

如果是kernel错误,会直接放到/proc/last_kmsg文件(下次重启后会有)

如果是Modem错误,会直接有/proc/last_amass文件出现(高通平台)。

android 存的死前信息 /proc/last_kmsg

android 修改的 kernel 有一項是 RAM console
這一塊區域在系統 reboot 後,不會消失 (當然不能斷電)。

access point 是 /proc/last_kmsg

要看的話,可以把他 cat 出來。

ref: https://code.google.com/p/tegraowners-ics-rom/wiki/How_to_get_logs

2013年3月14日 星期四

V-USB, software USB -- 用 GPIO 作

基於 V-USB 的一堆project/product


usb bootloader : http://www.fischl.de/avrusbboot/

一個 bootloade,利用 GPIO (JMP)作模式切換:normal boot 或 download。
download mode 時,會利用 V-USB 模擬一個 usb 1.1 device,所以可以經由 PC usb download hex,燒錄。
燒錄完成後就可以調整 gpio 作 normal boot。

... 那..第一次的 bootloader 要怎樣燒?


usb asp : http://www.fischl.de/usbasp/

利用 V-USB 和 pc 連接,經由自己的 usb protocol 控制 gpio,模擬成 SPI, I2C。


2013年3月6日 星期三

插上 JTAGICEMARKII 的 kernel message:
[24180.108191] usb 2-1.1.4.4: new full speed USB device using ehci_hcd and address 19
[24180.217420] usb 2-1.1.4.4: New USB device found, idVendor=03eb, idProduct=2103
[24180.217426] usb 2-1.1.4.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[24180.217430] usb 2-1.1.4.4: Product: JTAGICE mkII
[24180.217433] usb 2-1.1.4.4: Manufacturer: ATMEL
[24180.217435] usb 2-1.1.4.4: SerialNumber: 0700000011D3
[24180.217607] usb 2-1.1.4.4: configuration #1 chosen from 1 choice

用 avrdude -c asdsd 會列出support 的 programmer type, (asdsd 可以亂打)

所以用的command 是: avrdude -c jtagmkII -p x128a3 -P usb

LDM. UDM and DQ0-15

data bus 是 16 bit 的 chip(DRAM),都會有 LDM, UDM 這兩個信號。
從 DRAM 的 Data Sheet 來看:


因為databus 是 16bit,所以作 byte write 時,data bus 的 16 bit 都會有信號。
所以需用 U.LDM 告訴 chip 是要對 Upper 還是 Lower byte 作 write 動作。

byte read 的時候不需要,因為 host cpu 只需要把 16 bit 都讀近來,然後把不要的 byte 丟掉就可以。

所以在 layout 的時候,為了走線方便,需要調換 DQ0-15 ,
這時候就要注意:
  • LDM 要和 DQ0-7 一起調換到 High 或是 Low byte data line
  • UDM 要和 DQ8-15 一起。

至於 DQ0-7 之間,則可以隨便交換。

標籤

網誌存檔