星期五, 4月 28, 2006

browse sourcecode with vi - taglist

常常要用vi 作source browse. 在 只放拖鞋的鞋櫃 看到這篇,
把安裝和使用的部份"引用"一下....

安裝方法很簡單,把下載的plugin放進「~/.vim/plugin/」。想要打開旁邊的小視窗,只要下「:TlistToggle」就行了。

或著你可以把下面兩行放進 「~/.vimrc」

    nnoremap <> <> :TlistToggle<>
    nnoremap <> <> :wincmd p<>

vim在開檔的時候就會自動載入兩者,只要按F12就可以打開/關閉 taglist,按下F9就可以在兩個視窗之間跳動。

到時候,也來裝一下...

Not so clear : another "Surface".

上一篇提到2-D 加速引擎用surface代表input,output的概念。
另一個地方也用到Surface這個名詞:display control。

Valid Surface 種類有
  • Video
  • OSD
  • PIP
利用這個 Surface種類,
用ReadScalerModuleID取得對應Surface的Scaler ModuleID (大概是類似handle之類的東西)。
奇怪的是chip對Video,OSD和PIP都只有各一個對應的scaler,幹嘛不直接用Surface來帶替ModuleID。還要轉一次..

之後有些對這個Scaler的動作,function卻都取名為Surface,例如:
  • WriteSurfaceSource : 指定這個 Scaler 的Vidio input property。

something about osd 2-D acceleration engine

虛擬的觀念: surface ,代表engine 的input , output。
  • input surface - 從DRAM ,一般是image檔。
  • output surface - 就是螢幕。
engine 需要working space,所以每個surface都要操作空間: address。
  • input 還好,因為load image 到DRAM後,自然就要用到space。把這個space的start address assign 給input surface就可以。
  • output 就要prorgrammer估計,最大會要多少,alloca後再assign給output surface。

每個surface還要指定color 的format : true-color 或是palette。如果是palette的話,還要再將palette table 設定好(也就是color array),拿給surface。

設定好input surface 和output surface的property後,input的圖形還不會update到output,要執行一個command,ReplaceRectangle,指定input surface中的區域範圍 要 畫到 output surface的哪一個區域範圍。

如果是繪圖的動作,像Fill Rect,line,Circle.. poly,就不用指定surface了,因為他直接作內部的2-D 加速engine的圖形產生器,直接畫到 output surface。

modify the MIC MAC address : use ifconfig


ifconfig eth0 hw ether 00:21:23:34:04:05
但是在修改前,要先down eth0。

ElecVision - CMOS module for small device

以前一直要找的device,..
http://www.elecvision.com/
宜霖,專門生產小裝置用的影像模組。
到他的產品網頁去看,可以看到他的影像模組與一般CMOS影響模組的差異。
他的模組不需要以DMA作媒介(內含buffer ?)。
可以用慢速的interface,所以很適合resource limited mcu。

這一篇 EEDesign(http://www.eedesign.com.tw/article/Forum/fo525.htm) 有詳細說明 使用這一家的image module配合 8 bit risc 的產品。




可惜,東西總是在不需要時才會出現....

星期四, 4月 27, 2006

VGA input : snow flick - bus too long

VGA input , 用AD9883A 轉digital 後進入 graphic input port。
結果:
snowscreen
雪花片片,顏色也不對。

經理說是 AD9883A到 video processor 的trace太長了,一般只能在 2 inch 內。
把resolution 由800x600x60 改到 640x480x57後,果然有比較好..

snowbetter

難怪我一開使用AD9883的對大解析 來測,完全沒有東西... -____-

這樣的話....看來HDMI的 input也不會好到哪裡去....

AD9883A - capturing RGB signal from computer

這個IC就是把VGA的RGA類比信號轉成 各8bit的RGB數位資料。
就是Video Signal的AD converter。

AD9883A最高支援到1280x1024x75Hz 的 VGA Anglog input信號。

但是要注意...RGB BUS的trace不可以啦太長..

PI5V330 - bidirection Mux/Demux

很奇怪的device :
PI5V330

是雙向的,也就是說,他只是一個switch,不管方向。
用在Video上,因為有4 chan (RGB, YCbCr...?)。
選擇 input video source,
或是 output video to port N.

任何一端都可以由 current output RAMDAC 或是voltage output composite video source。

這裡 http://www.circuitrydesigns.com/dc/1212/switching-rgb-video.htm 是一篇AN,用PI5V330 切換RGB輸出到TV或是Monitor。(TV的signal還要加上 AD722 RGB encoder)




PERICOM 的產品。
可以到400MHz。

可以用來取代HC4053 multiplier and buffer/ampilier.

$150 PC - by China CPU

大陸出了幾款低價PC,不含monitor, 光碟機,只要 $150.
這個 是其中一家的產品規格:
http://yellowsheepriver.org/products.html
ProcessorMunicator 2C Chinese CPU 400/800
  • Support 64-bit SysAd
  • Speed = 400-800 Mhz
  • BGA package

  • Flash ROM

    2/4Mbit Flash ROM



    Chipsets

    North bridge : Marvel MV64420-BDM1C133

  • FSB 133MHz
  • DDR166MHz
  • PCI 32-bit 33MHzSouth bridge : VIA VT82C686B



  • VGA
    ATI Radeon 7000-M
  • 33MHz 32-bit PCI
  • Internalized with 16MB DDR RAM buffers
  • Support VGA port & S-Video output



  • Storage
    40G HDD:Easily upgradeable ATA100/66/33 support
    40PIN+PCS 44PIN X 1
    Optional
  • Optical Storage: CD-ROM / DVD-ROM / Combo Drive (DVD-ROM+CD-RW) / DVD+RW / DVD Dual



  • System Memory

    PC2700 SODIMM slot,

    Support DDR 266 module, 128MB/256MB/512/MB,
    512 MB total memory capacity.




    I/O Interfaces

    Front Side

  • AC'97 Codec ALC210A (Mic-in, Audio out)
  • USB 2.0 port X 4
  • IrDA X 1
  • Power switch x 1 & Reset switch x 1
  • Indicator for power x 1 & Indicator for Rear Side
  • S-Video connector
  • VGA out port
  • RJ-45 LAN port
  • RS-232 DB9 COM port
  • PS/2 port
  • DC-in jack
  • One 4-pin power output-connector (support +12V, +5V output)
  • One IDE device
    Onboard
  • One mini-IDE device




  • Communication
    Internal LAN: On-board 100M/10Mbp/s Ethernet LAN controller Realtek : 8139D
    WiFi-compliant wireless LAN (IEEE 802.11a/b/g) by USB dongle(Optional) Modem (Optional)


    OS support
    THINIX 3.0 (Based on CSIP RPLinux)


    AC adapter

    Auto-sensing dual voltage support, AC100-240V
    45W, 2Pin, DC 12V, 5A




    Slots
    IDE X 1 + mini-IDE X 1 + SO-DIMM Socket X 1


    Dimension(L*W*H) mm

    180 X 145 X 37mm




    Weight (kg)

    0.65kg




    Regulatory to be Compliance

    3C, CB, CE, FCC, TUV, UL, BSMI




    Accessories
    Packing Accessories
  • Quick Guide
  • Support CD (Driver, Utility, Manual)
  • AC Adapter
  • Power Cord Factory Option
  • 802.11b/802.11g WLAN Card
  • Li-Ion battery pack
  • Optical Device: DVD-ROM, Combo Drive(DVD-ROM+CD-RW), DVD Dual (DVD+/-RW), Super Multi (DVD+/-RW+DVD-RAM)



  • * The specification is subject to change without prior notice.
    2006.02.27
    其中的cpu,在這裡有大略的規格:
    http://www.techimo.com/articles/index.pl?photo=16
    .

    Godson-I



    Godson-I
    Microprocessor



    Instruction Set
    "MIPS-like"


    Integer Processing Unit
    32-bit


    Floating-Point Unit
    64-bit


    Operational Frequency
    266 MHz


    Front Side Bus
    Frequency

    50 - 100 MHz


    Transistor Count
    4,000,000


    L1 Cache Size
    16 Kilobytes


    Core Die Size
    0.18-micron


    有一篇說:
    http://www.goemex.com/emex2005/tw/news_detail.asp?order_no=2599
    一些歐美硬體愛好者在論壇對CeBIT參展的Municator討論代表了國人同樣的疑問:



      “我現在花費179美元就可以購買一套基於AMD的系統,為什麼要買149美元的Municator?”——龍芯架構和Linux作業系統的相對封閉性,都是大眾消費者所顧慮的。
    這個問題。.... 大概在中國,只要加上"民族情感"東西,都能賣得很好吧?




    但是,有開始總是不錯,現在雖然是mips-like,,將來或許就會有自己的架構出來了。

    自己的instruction set,要修改gcc,cross-compile kernel,retarget 所有package,甚至X Server,這還真是大工程(如果instruction 真的和mips差異很大的話...)。
    奇怪的是 上面寫可以run skype....... skype 沒有release source code 呀,要如何cross-compile ??

    星期三, 4月 26, 2006

    quote ? 合理的引用?

    最近比較有名的blogger事件是 有關 引用/網摘 的。
    以往,寫網頁的人 都希望自己的網頁 點閱 率高。
    但是 現在 時代好像變了...

    有些 blog 並不希望 這樣,他只希望 自己 默默 的寫。
    或是 寫給一些 小眾 看。

    所以一些 有名的網站 quote 或link到他的網站 時,他就 出來說話了。
    說不希望 被引用。甚至有連結。

    有的,還甚至 趕緊 將自己的 blog刪除。
    .....導致 大家更想 從一些庫存網頁 找出 他到底寫些甚麼 (見不得人的?)
    東西?


    所以說,大概是 blog 讓寫網頁的技術層次 降低,讓很多非IT人員也可以寫網頁。
    但是 非IT人員可能就沒有那樣的意識:internet 上沒有 private 的訊息。
    所以才會 肆無忌憚 的 暢所欲言 (這也是blog 比以前單純的個人網頁好看的原因? )。
    結果?一旦發現 :原來大家都看得到!才急忙的到處滅火,但是internet 信息傳播的速度還真是比尋常 (尤其有了RSS 後)。最後只好刪除自己的網頁。真是可惜呀。....

    blog host應該提醒blogger : blog是開放的空間,所以不要寫一些不能讓人知道的事喔。
    所以 你要是 為善(惡?)不欲人知。最好就不要把那些事 寫上。
    因為,遲早 總是會有一些 無聊閒逛 的人 (或bot) 找到你.. :P




    亂寫的,別打我..

    3:2 pull down - motion adaptive

    意思是說,在使用motion adative 作deinterlace時,使用三張image 來產生計算。
    這樣可以減少快速動作的 "橫線" 現象。

    -- 實際測試還未知。

    事情果然沒有那麼簡單...

    本以為Server的local NIC 修復,這下可以恢復使用blogger,
    但是... 原來是其他部門要用房間,所以報修的。
    這下,整個Server要換位置。
    這可不簡單,因為ADSL 的 LINE 在那個房間,要移位的話 又要 申請....

    更慘的是.... 現在連Serveρ以放哪 都不知道....

    星期二, 4月 25, 2006

    Oh yeah !! blogger comes back again !!

    Server的另一個NIC connect OK了,所以可以經由有線連過去proxy,不必經過很慢的wifi了。

    所以這是莫非定律?

    星期一, 4月 24, 2006

    唉,Blogger真的不能用了..

    最近一個禮拜,在公司都不能login 進入create post 網頁.. Q___Q
    (回家倒是都OK)。

    是po太多篇,要終止了嗎?
    還是hinet 的關係?

    要換一家 blog host了....

    真可惜,blogger的po文模式(html/write互換)。已經用得很習慣了呢。
    (雖然自己po文竟然還要輸入 影像 確認 這一點有一點 誇張..)




    換哪一家好呢?

    看來wordpress的好像不錯,用wordpress的free host可以customize的好像都很多。

    所以,就 先試試 blogsie .

    星期五, 4月 21, 2006

    iPod Nano, a fancy toy

    買了一個iPod nano,,,
    因為 1G ,small size,可以播放AAC和lossless的,iPod nano 竟然是這些產品中最便宜的 (真奇怪,不符合apple產品的特性)。當然,他也是最小的(沒螢幕的shuffle不算)。

    在買之前就聽過很多人對iPod + iTune的批評,所以對於不好使用這一點,也有心理準備。




    實際使用後,發現iPod 對於有CD的使用者來說,真的是很方便。放入CD後,一切自動。
    還會依照CD內容作分類。讓你可以經由各種方式來選取(聽說這是Creative的專利)。

    iPod的功能就侷限在聽歌,其他 諸如 安排 playlist,刪除。edit data等,都要經pc來作。
    而且還要經由iTune,不像一般mp3 player,可以經由"抽取式裝置"來直接增刪。

    也因為這樣的限制,反而 增加了 想買 新CD的慾望。 買CD,把他灌入 iPod中。

    所以一下子,1G的容量就滿了, 難怪,iPod 最小由1G起跳(沒螢幕的shuffle不算)。
    大概是因為1G 是iPod的操作模式中,所能 容忍 的最小容量了。



    但是很奇怪的是,雖然iPod nano的造型很漂亮,但是 卻很容易 刮傷,所以又要去買一些 保護套。
    這樣,為什麼當初不就作成 保護套的外型呢?反正一旦包上 果凍套後,拿出來使用的機會應該很少了吧?(當然,如果真的作成這樣,銷路應該會大減)

    還有那個觸摸式轉盤,有點太下面了,我真懷疑外國人這麼大的手掌。要單手握持,用拇指滑動,應該很困難吧,一不小心就會掉到地上。

    還有在插著耳機時,同步/充電插頭很難拔出來。

    What's up ? What's wrong with Blogger this time ?

    blogspotdown_2
    這次又是怎樣?
    一整天都進不入來blogger的post 頁面,一直出現這個畫面。
    上次發生這樣的情況是hinet的網管把blogger當作是spam網站(-___-)。

    這次呢?
    很巧的是 這次我用adsl和公司 網路來試都不行。
    但是在家裏卻OK。

    公司和ADSL都是hinet的.....唉。所以 還是分散開來比較保險呀。

    星期三, 4月 19, 2006

    reading makefile : toolchain : arm-elf-gcc, uclibc

    每次都rebuild有點蠢,應該要看看是否有depency...

    toolchain :
    CCACHE_TARGET = ccache/ccache
    BINUTILS_TARGET = bin/ld
    GCC_TARGET = bin/arm-elf-gcc
    UCLIBC_TARGET = libc.a,crt0.o, crt1.o, crti.o, crtn.o, gcrt1.o, libcrypt.a, libm.a, libnsl.a, libpthread.a, libthread.a, libresolv.a, libutil.a.
    STLPORT_TARGET = libstdc++.a , .header_installed
    BOOTPARM_TARGET = bin/bootparm
    GENROMFS_TARGET = bin/genromfs
    GENEXT2FS_TARGET = bin/genext2fs
    GDB_TARGET = bin/arm-elf-gdb


    ccache 的source 是ccache-2.3.tar.gz. - 這個不知道是要幹嘛的。
    build的過程和一般package的動作是一樣的:
            CC=$(HOSTCC) CC_FOR_HOST=$(HOSTCC) CXX_FOR_HOST=$(HOSTCC) $(CCACHE_SRC_DIR)/configure        --host=$(GNU_HOST_NAME)        --prefix=$(STAGING_DIR)        --exec-prefix=$(STAGING_DIR)        -v;)

    $(MAKE) -C $(CCACHE_DIR) all
    .然後建link :
            mkdir -p $(@D)
    mkdir -p $(CCACHE_DIR)
    cp -f $< $@ ln -sf ccache $(@D)/$(TARGET)-gcc ln -sf ccache $(@D)/$(TARGET)-g++ ln -sf ccache $(@D)/gcc ln -sf ccache $(@D)/g++ ln -sf ccache $(@D)/cc
    ccache好像是能減少build的時間,ref Debian Wiki的說明:

    ccache 會 cache C/C++ compiler pre-processor 的輸出, 在編譯時自動判斷是否要重新編譯。如果原始碼沒有很好的 make dependency, 導致您每次都要用類似
    make clean; make
    的方式重新編譯整個 source tree 的話, ccache 能大幅縮短編譯所需的時間。
    arm-elf-gcc:
            $(MAKE) -C $(GCC_BUILD_DIR) -w install-gcc LANGUAGES="$(TARGET_LANGUAGES)"
    rm -rf $(TARGET_DIR)/info $(TARGET_DIR)/man $(TARGET_DIR)/share/doc $(TARGET_DIR)/share/locale
    # patch gcc spec file
    $(SOURCE_DIR)/patch-kernel.sh $(TARGET_DIR)/lib $(SOURCE_DIR) post-gcc-2.95.3-spec.patch
    mv $(TARGET_DIR)/bin/cpp $(TARGET_DIR)/bin/$(TARGET_CROSS)cpp
    ...所以重點在gcc的Makefile..和spec.path.
    Spec適用來傳遞給程式的選項清單。Spec中也能者定取代字串變數。
    Spec的內容:
    %command   : 執行command
    *spec_name : 建立,刪除,修改 spec_name指定的spec字串
    suffix :建立/修改suffix 規則
    spec的command只有三種: include,include_noerr, rename。
    ..有點複雜.. ref : GCC 完全指南 p 116.

    gcc 的 configure option:
             CC=$(HOSTCC)                                                $(GCC_DIR)/configure                                               --target=$(GNU_TARGET_NAME)                                 --host=$(GNU_HOST_NAME)                                     --build=$(GNU_HOST_NAME)                                    --prefix=$(STAGING_DIR)                                     --exec-prefix=$(STAGING_DIR)                                --bindir=$(STAGING_DIR)/bin                                 --sbindir=$(STAGING_DIR)/sbin                               --sysconfdir=$(STAGING_DIR)/etc                             --datadir=$(STAGING_DIR)/share                              --includedir=$(STAGING_DIR)/include                         --libdir=$(STAGING_DIR)/lib                                 --localstatedir=$(STAGING_DIR)/var                          --mandir=$(STAGING_DIR)/man                                 --infodir=$(STAGING_DIR)/info                               --with-local-prefix=$(STAGING_DIR)/usr/local                --oldincludedir=$(STAGING_DIR)/include                      --enable-languages=c,c++                                    --with-gnu-as -with-gnu-ld                                  --enable-multilib                                           --with-gxx-include-dir=$(STAGING_DIR)/include/stlport                $(EXTRA_GCC_CONFIG_OPTIONS)) 
    uclibc的build 動作..
    configure:
    $(UCLIBC_DIR)/.configured: $(UCLIBC_DIR)/.patched $(LINUX_DIR)/.configured
    sed -e 's,@KERNEL_SOURCE@,"$(LINUX_DIR)",' < $(ACTUAL_CONFIG_DIR)/uClibc-$(UCLIBC_VERSION).config \ > $(UCLIBC_DIR)/.config
    $(MAKE) $(MFLAGS) -C $(UCLIBC_DIR) oldconfig
    $(MAKE) $(MFLAGS) -C $(UCLIBC_DIR) headers install_dev;
    cp -R $(UCLIBC_DIR)/_install/include/* $(STAGING_DIR)/$(TARGET)/include
    make:
    $(uclibc_arch_libs): $(UCLIBC_DIR)/.configured .staging_dir_made $(GCC_TARGET)
    $(MAKE) $(MFLAGS) -C $(UCLIBC_DIR) clean
    $(MAKE) $(MFLAGS) ARCH_CFLAGS="$(UCLIBC_ARCH_CFLAGS)" -C $(UCLIBC_DIR)
    $(MAKE) $(MFLAGS) -C $(UCLIBC_DIR) install
    cp $(patsubst %, $(UCLIBC_DIR)/_install/lib/%, $(uclibc_libs)) $(@D)
    其中MFLAGS :
    MFLAGS := TARGET_ARCH=$(ARCH) CROSS=$(TARGET_CROSS)
    .

    星期二, 4月 18, 2006

    The Strange SAW type fonts

    播放電視還OK。因為台灣的DTV source 本來品質就不好,
    但是有一台,應該就是自己的問題了:
    sawpic
    看到..很明顯的鋸齒...
    有時會突然OK一下,字型邊緣變得模糊,但是,同時 整個畫面也變得模糊了......

    NFS Server For Windows

    其實是用Cygwin..
    因為常常要將test stream file copy到VM裡,用linux exports nfs 很麻煩,test stream file size 又很大,所以想直接從Windows nfs server exports ,,,
    但是NFS server for Windows 好像都不是Free的,
    然後就找到這個...
    Windows 裝Cygwin 再裝nfs server。
    Cygwin 的安裝就不用說了,到Cygwin download Setup,然後執行就是,記得internet 連線速度要快一點。

    安裝Cygwin時,要記得將下面的幾項package打勾(安裝):
    • Net Catergory -- nfs-server
    • Lib Category -- sunrpc
    • Admin Category -- cygrunsrv
    裝完,開始第一次設定nfs server:
    到Cygwin 環境下.. run
    /usr/bin/nfs-server-config
    會問一些問題,要run nfs server for seperate user,如果是Win2000系統,為了避免麻煩,回答no (也就是說,不用用seperate account 來run),如果是XP的話,就一定要(回答yes)。接著就會安裝一些daemon ... 然後 create /etc/nfs/server.map 。
    在我的系統裝時,出現問題:
    line 223 : UID is readonly variable
    查了一下nfs-server-config 的223行,發現是
    UID =$(id -u)
    但是用#echo $UID看了一下,UID已經是環境變數了,不需要再設定一次,所以把這一行comment掉。再run一次nfs-server-config (daemon不用再裝),就OK了 (/etc/nfs/server.map create OK)。
    編輯/etc/hosts.allow,把 client 的ip加入,如:
    nfsd: 148.150.62.152
    如果要allow 一個range :
     nfsd: 148.150.0.0/255.255.0.0
    Edit /etc/exports (這部份就跟 linux一樣了):
    /pub 148.150.62.0/255.255.255.0(ro,no_root_squash)
    其實exports檔裡面有很多sample.

    OK,開啟nfs server : 在Windows的 "系統管理工具 -- 服務" 會出現三項:
    • Cygwin mountd
    • Cygwin nfsd
    • Cygwin portmap
    右鍵選取 : 開始。就OK了。

    記得每次更改 /etc/exports時,要重新啟動一次service。

    還有一些,應該是Cygwin的問題,cygwin 把c, d driver "mount" 在 /cygdrive/c, /cygdrive/d。
    但是這兩個 folder 不能export,用ln -s 建link也不行。

    星期一, 4月 17, 2006

    OSNEWS : On Microkernel ..

    OSNEWS的文章 : why I like Microkernels.

    MINIX,以前研讀的OS。果然是很具教學性。後來才知道 Linux 和這個也大有關係。

    我也不知道為甚麼microkernel真的會比較好,其實我覺得凡是有好處就必定有壞處。
    microkernel,monolithic都一樣。

    大概寫了一下,其中一部分...
    對micro-kernel 系統而言,有可能會造成system crach 的東西,都在kernelspace以外。以MINIX3為例,除了clock外,所有的driver都是存在userspace。

    所以當一個有bug的driver當機時,影響的只是一個driver。kernel 依然可以正常運行。

    當你把那個driver的bug解除後,可以再啟動那個driver,系統恢復正常。

    也就是說,在driver down到restart 之間,kernel都還是正常的。同樣的,你也可以抽換/升級任意的driver,不需要restart system。

    當然,在microkernel 中也可能有bug,導致kernel crash,以MINIX 3為例,他的kernel 有大約3800 行的code,有bug存在的空間。

    然而Andy Tanebaum 和他的MINIX 3team認為這樣的大小還是很有可能可以做到bug-free,讓他更接近一個可以永久運行的系統。

    和 linux 2.6 的程式大小比起來(約600萬行)。MINIX 3 的kernel 應該更容易做到bug-free。

    microkernel的另一個好處是簡潔,系統所有的driver,filesystem,unction ,,都是分離,在自己所屬的userspace中執行,所以各部系統可以做得相當local化。也就是可以做得比較簡傑。這樣也比較容易維護(對個別driver, function 而言)。

    這樣在local level上,microkernel 比較容易維護,但是以global 來看,就比較麻煩了。

    以Global的觀點來看,microkernel比較複雜,同時也代表microkernel的overhead比較多。

    因為各個function,driver都是各自獨立的,他們之間要溝通比較不容易,所以合作起來需要比較多的手續。

    這也就是Linux當初認為microkernel比較不合適的原因。因為在90年代,computer的能力不強,常常需要可慮一些可以增進performance的方法。

    看完後,覺得還是一樣,programmer常常面對"follow architecure,走遠路?還是走已知的捷徑?"的抉擇。

    星期五, 4月 14, 2006

    Use VMWare Player in Linx : create VMD with QEMU

    這個是從 sshlog 的blog看到的,
    VMWare的free 版本 : VMWare Player ,幾乎有Workstation 一樣的功能。
    但是最不方便的是,不能create VM和Virtial HD。
    所以都要用其他VMware裝好的VM,copy過來用。

    但是sshlog的文章中,用QEMU 來create HD image :
    #sudo apt-get install qemu
    #qemu-img create -f vmdk WindowsXPPro.vmdk 2G Formating ‘WindowsXPPro.vmdk’, fmt=vmdk, size=2097152 kB
    至於VM檔,sshlog的blog也有說明,不過很長,這個大概是參考build好的VM檔建立的吧:
    WindowsXPPro.vmx #!/usr/bin/vmware
    config.version = “8″
    virtualHW.version = “3″
    ide0:0.present = “TRUE”
    ide0:0.filename = “WindowsXPPro.vmdk”
    memsize = “192″
    MemAllowAutoScaleDown = “FALSE”
    ide1:0.present = “TRUE”
    ide1:0.fileName = “WindowsXPPro.iso”
    ide1:0.deviceType = “cdrom-image”
    ide1:0.autodetect = “TRUE”
    floppy0.fileType = “file”
    floppy0.fileName = “cdboot1.img”
    floppy0.startConnected = “True”
    ethernet0.present = “TRUE”
    usb.present = “TRUE”
    sound.present = “TRUE”
    sound.virtualDev = “es1371″
    displayName = “Windows XP Pro”
    guestOS = “winxppro”
    nvram = “WindowsXPPro.nvram”
    MemTrimRate = “-1″
    ide0:0.redo = “”
    ethernet0.addressType = “generated”
    uuid.location = “56 4d 15 5e 2f a8 0a dd-21 1a c2 83 2f 44 d3 40″
    uuid.bios = “56 4d 15 5e 2f a8 0a dd-21 1a c2 83 2f 44 d3 40″
    ethernet0.generatedAddress = “00:0c:29:44:d3:40″
    ethernet0.generatedAddressOffset = “0″
    tools.syncTime = “TRUE”
    ide1:0.startConnected = “TRUE”
    uuid.action = “create”
    checkpoint.vmState = “WindowsXPPro.vmss”
    tools.remindInstall = “TRUE”

    以上兩段code都是copy自sshlog

    A hardware DDOS attact method.

    richliu’s blog 看到的,Dlink 在一個產品建了一個NTP server 列表,定期的向列表中的server對時。

    所以? 這個產品越賣越多,這種定時對時封包就越來越多,而且因為是固定的列表,所以封包都湧向同一個server。

    就像 DDOS攻擊一樣。

    真有趣,想出這個主意的Dlink 工程師,不知道知道這個消息了沒?

    無意中,成為攻擊者。

    ?所以 最可怕的hack應該是device 的firmware engineer吧,要是他至入一些定時炸彈或是後門在network device的話....

    這一篇 是事情的始末和設計類似產品的建議..


    記得以前也有機會,受到客戶要求,要加入向NTP 對時功能。
    那個NTP server好像是由客戶輸入的...

    不過,產品不可能賣得像Dlink那麼多,所以就算是寫成這樣,大概也不會被發現吧....
    (?? 或許...... )

    星期三, 4月 12, 2006

    PCI bus error : 6920

    ifconfig eth0 up 出現一大堆eth0 : PCI Bus error 6920.
    google了一下。還好有人po 類似的問題,也是rtl8139。
    只有一篇有解答: http://www.linuxquestions.org/questions/showthread.php?postid=1679854

    大意是說 是 kernel config時 memory size設定不正確。

    我也是一樣,設定成128M時就有,設成64M時就OK。
    但是我的target board真的是有128MB呀。

    星期二, 4月 11, 2006

    Somthing about PCI ..

    因為重新build的kernel run起來又有eth0 : PCI Bus error 6200,所以又要digg 一下code..
    先看看pci 的一些資料 ( ref : Linux Device Driver):


    有關PCI bus的觀念和Linux PCI device driver的說明,在 IBM developerWorld的Linux下pci設備驅動程式開發,有很好的說明。

    PCI configuration registers 共有256 bytes,定義在<linux/pci.h>下:
    pci_cr

    #define PCI_VENDOR_ID 0x00 /* 16 bits */
    #define PCI_DEVICE_ID 0x02 /* 16 bits */
    #define PCI_COMMAND 0x04 /* 16 bits */
    #define PCI_STATUS 0x06 /* 16 bits */
    #define PCI_REVISION_ID 0x08 /* Revision ID */
    #define PCI_CLASS_PROG 0x09 /* Reg. Level Programming Interface */
    #define PCI_CLASS_DEVICE 0x0a /* Device class */
    #define PCI_CACHE_LINE_SIZE 0x0c /* 8 bits */
    #define PCI_LATENCY_TIMER 0x0d /* 8 bits */
    #define PCI_HEADER_TYPE 0x0e /* 8 bits */
    #define PCI_BIST 0x0f /* 8 bits */
    #define PCI_BASE_ADDRESS_0 0x10 /* 32 bits */
    #define PCI_BASE_ADDRESS_1 0x14 /* 32 bits [htype 0,1 only] */
    #define PCI_BASE_ADDRESS_2 0x18 /* 32 bits [htype 0 only] */
    #define PCI_BASE_ADDRESS_3 0x1c /* 32 bits */
    #define PCI_BASE_ADDRESS_4 0x20 /* 32 bits */
    #define PCI_BASE_ADDRESS_5 0x24 /* 32 bits */
    #define PCI_CARDBUS_CIS 0x28
    #define PCI_SUBSYSTEM_VENDOR_ID 0x2c
    #define PCI_SUBSYSTEM_ID 0x2e
    #define PCI_ROM_ADDRESS 0x30 /* Bits 31..11 are address, 10..1 reserved */
    /* 0x35-0x3b are reserved */
    #define PCI_INTERRUPT_LINE 0x3c /* 8 bits */
    #define PCI_INTERRUPT_PIN 0x3d /* 8 bits */
    #define PCI_MIN_GNT 0x3e /* 8 bits */
    #define PCI_MAX_LAT 0x3f /* 8 bits */
    存取pci configuration register的方法是用<linux/pci.h>中提供(protype)的function :

    int pci_read_config_byte(struct pci_dev *dev, int where, u8 *val);
    int pci_read_config_word(struct pci_dev *dev, int where, u16 *val);
    int pci_read_config_dword(struct pci_dev *dev, int where, u32 *val);
    int pci_write_config_byte(struct pci_dev *dev, int where, u8 val);
    int pci_write_config_word(struct pci_dev *dev, int where, u16 val);
    int pci_write_config_dword(struct pci_dev *dev, int where, u32 val);
    由於pci 使用little endian,這幾個多byte r/w function 會依照host machine的nature自動轉換。
    pci configuration register的內容可以在 /proc/bus/pci/xx/xx.x 下列出。
    其中XX/xx.X就是pci deive的device, function id。
    使用lspci (或是 cat /proc/pci ) 可以看到。
    舉例來說,我的ethernet card 在lspci 中列出是:
    0000:00:11.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 10)
    所以他的configuration data在 /proc/bus/pci/00/11.0。
    因為data是binary,所以要用od 轉成hex ascii 來看:
    $ cat /proc/bus/pci/00/11.0 | od
    0000000 010042 020000 000007 001200 000020 001000 040000 000000
    0000020 010201 000000 000000 000000 000000 000000 000000 000000
    0000040 000000 000000 000000 000000 000000 000000 010042 020000
    0000060 000000 000000 000000 000000 000000 000000 000412 177406
    0000100
    對應上面<linux/pci.h>的address定義,可以知道內容。


    接下來trace一下boot message中PCI 的部份:
    PCI: bus0: Fast back to back transfers disabled
    PCI: Configured XX as a PCI slave with 128MB PCI memory
    PCI: Each Region size is 16384KB
    PCI: Reserved memory from 0x10080000 to 0x12080000 for DMA and mapped to 0x12000000
    找..
    #grep -i 'as a pci slave' * -r
    在 arch/armnommu/mach-xx/pci_xx.c : void xx_pci_init(void *sysdata)
    function 放在
    struct hw_pci xx_pci = {
    init : xx_pci_init,
    setup_resources : NULL,
    swizzle : no_swizzle,
    map_irq : xx_pci_map_irq,
    mem_offset : MEMORY_BASE_PCI_MEMORY,
    io_offset : MEMORY_BASE_PCI_CONFIG,
    };
    reference 這個 xx_pci的大概是 arch/armnommu/kernel/bios32.c : void __init pcbios_init(void)
    這個function 依照kernel config 的內容,將xx_pci 指定到 struct pci_sys_data->hw。

    A Nice Weather Report Site

    一個不錯的天氣預報網站。
    依照地圖列出(就項電視的氣象報告一樣)。
    同時點入縣市,還有詳細的一週預報
    weatherreport
    忘了說,就是中央氣象局的網站

    星期一, 4月 10, 2006

    NIC problem solved - Thanks Tsailin

    剛剛的問題: 網路無法啟動。
    本以為是hardware的問題。Tsailin 來,就順便問一下message : nolink 是甚麼意思。
    Tsailin說這個是hardware ok,但是網路線沒接。

    喔?所以還是有希望。
    重新download kernel, boot,
    Tsailin說可以看看boot message,可以知道module有沒有正確detect到hardware...
    boot mesage果然有8139too 正確detect的訊息,但是..是eth1。..
    那eth0 是?

    繼續往上看eth0 是... build in的ethernet MAC....。
    所以用ifconfig eth0 up 產生的nolink messag是內部MAC產生的,因為沒用到內部MAC,所以沒焊接頭。

    改bring up eth1 : ifconfig eth1 up..
    出現 " pci bus error 6200 "
    google一下,有一篇說到 /proc/iomem /proc/ioport 可以看pci resource 。
    列出來看,看到8139too 的 io address被改掉了,和原來的不一樣。
    原位置被build in MAC佔掉。

    所以從kernel config中關閉 build-in Network support (就在network device的第一個階段(不在10/100 device中)。

    OK !!

    感謝Tsailin的協助.

    Some ld Options : --gc-section, -Ttext 0xff000000

    XX Bootloade有一個Option 可以讓loader在Ram中執行,不需要燒錄到flash中。
    Enable 這個option時,Makefile :
    ifeq ($(LOADERONRAM), y)
    $(LD) --gc-section -e t_stage0 -Ttext 0x90000404 -o $@ $(T_STAGE0_OBJS)
    else
    $(LD) --gc-section -e t_stage0 -Ttext 0xA0000400 -o $@ $(T_STAGE0_OBJS)
    endif

    --gc-section:
    是說要作garbage collection for unused input file : 大概是說將沒用到的function obj刪去不link進來。

    -e t_sage0:
    -e選項是指定entry point,所以這一個option command是指定entry point是 t_sage0 label。

    -Ttext 0x90000404
    只定.text section的start address,這個例子是指定為0x90000404
    .

    Test New Board : DRAM, Flash and NIC.

    因為是奇怪的boot程序: small flash boot --> download big bootloader, program big flash
    boot on big flash --> download kernel+root, program big flash.

    所以
    1. 先產生small flash bootloader,
    2. 燒錄,
    3. 焊上target board。boot
    4. Fail ! 解焊,回到step 1
    反覆。做到small flash因為焊/解焊 太多次而無法在燒錄了。
    拿另外一顆,繼續。

    倒楣的是另外一顆是不同vendor code。

    終於 OK。可以boot。但是時脈設定不對。DRAM data 會lost。
    但是很奇怪,反覆reboot,有時候會ok。所以
    1. reset target board
    2. test message ok
    3. download big flash bootloader
    4. program big flash
    5. boot big flash
    6. fail 回到 step 1
    一樣。反覆N次後,終於成功了。可以用big flash boot。
    當然big flash用的configuration,時脈是正確的。所以不用反覆reset。

    可以開始測試kernel了:
    1. disable all function. - minimum configuration
    2. build (include rootfs)
    3. download to ram
    4. program big flash
    5. boot -- ?
    bootloader出現 kernel : linux.bin found, unzip.... 就掛點了。
    所以?

    將 linux.bin download到ram裡試試,看看可不可以boot... OK!!
    因為boot cmd 設定rootfs在/memblk (flash),又因為剛剛已經將kernel+rootfs燒好,所以完全boot OK!

    所以?

    ---不知道要怎麼辦---

    先試試NIC : rtl8100 是不是OK ?
    當然..... 是不OK的。

    所以?


    還是改small flash 的code好了...因為了vendor code,chip id不一樣了,probe 不出來。
    看來會需要反覆燒錄 big flash bootloader ..

    星期六, 4月 08, 2006

    why there is no mail to blog

    昨天剛設好epnmy blog 的mail to blog。和Gmail 的filter - forward function。
    本想: Blogger -->Gmail Filter - Forward -->Epnomy Blog
    結果:今天一開Gmail,竟然有90幾封Epnonmy 的post mail。
    才發現:
    開啟了Eponmy blog 的post notification。
    所以一旦有post,就會mail到Gmail,但是這一封notification竟然又符合Gmail的filter,
    所以又forward給eponmy。eponmy又post,又notify。
    所以一個晚上,就post了90幾篇。


    所以趕快改一下Gmail的Filter。
    並且改一下Eponmy的notify mail format.,
    看看囉?

    這一篇會不會出現問題。

    Another Calender web : Kiko

    收到Kiko的spam mail,進去看看,是一個Calender網站。
    挺不錯的,有提供Email 通知。
    操作也很方便。
    可惜沒有中文介面。

    http://kiko.com/

    星期五, 4月 07, 2006

    Free Blog Host : with WordPress , a different login name

    又註冊了一個free blog : http://checko.blogthing.com/
    發現他的login方式原來username是admin。
    採用WordPress。

    這個bloghost雖然有提供mail to blog,但是user要自己準備一個pop3 mail server。
    -- 這樣有點愚蠢,因為所以mail 都會被post出來。尤其是現在這種spam mail這麼多的情況,應該不太能用。

    Try New Free Bloghost support mail to blog

    找找一個支援 mail to blog 的 free blog host : http://checko.eponym.com/blog

    是因為前一天的hinet 烏龍: 將blogspt視為spam網站。
    所以需要一個blogspot的備份。

    因為blogspot有post indicate - mail 的功能,每次post都會寄一份備份到指定的mail address。
    配合gmail 的filter 功能,將mail forward到 eponym.com。
    這樣就OK啦。

    可惜是:不支援中文Title。
    所以:都要用英文的啦。

    test一下常用的tag:
    這是程式馬的tag..
    int kunzip(char *zaddr, char *loadaddr, unsigned int heapaddr)
    {
    ulg orig_crc, crc;
    int i;

    outcnt=0;
    inptr=0;

    inbuf=zaddr;
    window=loadaddr;

    // heap in SDRAM
    // heap_base= loadaddr + 0x200000;
    heap_base = (char *) heapaddr;

    // max_heap_top=heap_base;
    heap_top=heap_base;

    updcrc(NULL,0);

    inptr+=10;
    while(*(inbuf+inptr)) inptr++;
    inptr++;

    uart_printf("Inptr = 0x%08x(%d)\n", inptr, inptr);
    uart_puts("Inflating....\n");

    i=inflate();

    uart_printf("Outcnt = 0x%08x(%d)\n", outcnt, outcnt);
    uart_printf("Final Inptr = 0x%08x(%d)\n", inptr, inptr);

    orig_crc = get_unaligned_long(inbuf+inptr);
    // orig_len = *(ulg *)(buf+4);
    uart_printf("Original CRC = 0x%08lx\n", orig_crc);

    // if(outcnt!=599388){
    // int ki;

    crc=updcrc(window,outcnt);
    uart_printf("Computed CRC = 0x%08lx\n", crc);

    if (orig_crc != crc) {
    // Kaboom !!
    uart_puts("Ckecksum mismatched!!\n");
    return -1;
    }
    在試試 > &lt...
    再來是item:
    • 第一點
    • 2nd
    縮排
    Hello !!!
    OK啦。

    星期四, 4月 06, 2006

    OpenSource DNA platform

    這個不錯: Hexlix DNA, Open source Version.
    player, Server, Codec..

    有空要看一下。

    烏龍的一天..partition id, kbuild usb-wlan and blogspot

    因為很久沒update了,所以今天就把server apt-get update, apt-get upgrade 一下..
    結果,kernel-image好像有換掉.. gnupg...之類的也換掉,要reboot。
    reboot後... usb wlan 不能用,message一出現command timeout。
    所以wlan-ng command一直無法完成。

    所以猜想是kernel header 換了,因為linux-wlan-ng 因為是由source code build的,
    所以要重新build (有這麼麻煩嗎?)

    所以reference了以前的筆記,開始拿latest version 來build --config 發生問題,說找不到kernel source。

    所以follow 自己以前的筆記,拿2.1pre26來config,果然,不一樣。
    但是一樣有找不到kernel header某些file。
    --- 好像是header folder 的script link不正確。link 到kbuild,但是我沒有kbuild。
    胡搞了一陣子,最後還是拿另一個debian system 來install header: 使用aptitiude ..
    結果dependency list kbuild !!
    所以install header就會install kbuild。

    回到原server,照著install一次。結果出現kbuild package cannot find !!
    糟糕!原來是reboot後忘記mount loop debian 的cd image。
    但是cd image在另外的hd中,為什麼沒有自動mount ?
    所以手動mount : mount /mnt/sdc。---- 竟然有error : no any journal block !!
    完蛋了,難道sdc, sdd掛點了??

    又再胡搞了一陣子,還是放棄吧。
    下次別再用甚麼ext3了,還是乖乖的用ext2吧。
    放入debian netinstall cd。
    reboot.. config ...... 到了hd configuration.. ?? sdc, sdd 是 ext2 ?
    所以是當初fstab寫錯了? (當初看到sdc1 id 83 時就猶豫了一下..)

    重開機。改fstab。mount OK。

    幸運的是,在boot時看到usb wlan 的message 是OK的。
    所以 wlan-ng command也ok了。

    記得wlan-ng 的readme中有寫到 有些usb device需要hard reset才能動作。

    所以?


    好啦,反過來想,至少知道了linux-wlan-ng 還是要用2.1pre26的版本。
    還有 kernel-header和kbuild的關係。
    還有? 應該不會忘記 ext2 的system id 是83了。


    還要記上一筆的是:blogspot出了問題,一直上不去,但是blogger主頁卻又OK。
    更誇張的是我還收到comment通知,所以?只有我自己有問題?
    ...
    看來用這裡當筆記簿也不太安全。還是要定期update到其他blog去才行。

    另外,原來是gmail 的filter - forward功能設定錯誤。導致blog post的通知mail 都會有一封是error。

    WinARM

    就是那個作WinAVR的做的,Windows上執行,for ARM的cross tool。
    以前試過WinAVR很不錯。這個應該也是一樣。
    這個作者的Tools特點是 使用GNU的tools在windows上執行,但是不需要安裝cygwin。

    看了一下說明:
    • 使用newlib
    • Insight-GDB Win32 native.
    • Setup-EXE of OCDRemote
    • 支援LPC21XX (Philip ARM)的ISP功能。
    好像不錯,這樣就不用去買貴貴的ADS了。

    星期二, 4月 04, 2006

    INITRD - embedded in kernel image

    Trace 一下 initrd...


    設定使用initrd後, .config
    LINUX_CONFIG_ROOTFS="initrd"
    CONFIG_ROOTFS_INITRD=y
    在config/kernel-config-initrd ..大概會用這個作kernel defaultconfig file吧。
    diff一下romfs和initrd..
    CMDLINE="root=/dev/ram0 rw"
    BLK_DEV_RAM=y
    BLK_DEV_RAM_SIZE=4096
    BLK_DEV_INITRD=y
    BLK_DEV_RAMDISK_DATA=y
    #BLK_DEV_BLKMEM
    應該是make linux-config時,block device的"RAM disk data block compiled in"這個 option吧。
    這個option configure在 drivers/block/Config.h
    dep_bool 'RAM disk data block compiled in' CONFIG_BLK_DEV_RAMDISK_DATA 
    所以好像有兩種initrd使用的方式:
    • 將initrd image和kernel 綁在一起。(append在kernel後面)
    • 另外存放,但是需要另外告訴kernel initrd image所在位置(memory address)
    在 arch/armnommu/kernel/setup.c: setup_arh( ):
    #ifdef CONFIG_BLK_DEV_INITRD
    // let the kernel know where the initrd exists
    #ifdef CONFIG_SD_INITRD_EMBED
    {
    initrd_start = (unsigned long) &__ramdisk_data;
    initrd_end = (unsigned long) &__ramdisk_data_end - (unsigned long) &__ramdisk_data;
    }
    #else
    initrd_start = CONFIG_SD_INITRD_START;
    initrd_end = CONFIG_SD_INITRD_START + CONFIG_SD_INITRD_SIZE;
    #endif
    #endif
    __ramdisk_data, __ramdisk_data_end 這兩個 label 定義在
    arch/armnommu/vmlinux-armv.lds.in:
    SECTIONS
    {
    . = TEXTADDR;
    .init : { /* Init code and data */
    _stext = .;

    __略__

    __ramdisk_data = .;
    INITRDIMAGE
    __ramdisk_data_end = .;

    . = ALIGN(4096);

    __init_end = .;
    }

    .可以看到在link時,會將INITRDIMAGE link進來。依照image的size決定__ramdisk_data, __ramdisk_data_end.

    另一個,不將initrd 和kernel link在一起的方法,則是在configure時define CONFIG_SD_INIT_START 和 CONFIG_SD_INIT_SIZE。




    所以重點就在...
    • enable kernel 對RAM disak, initrd的支援
    • 傳入適當的boot cmd
    查一下cmd line parse .. (這個以前作過...)

    root= 在 init/do_mounts.c : __setup("root=", root_dev_setup);
    static int __init root_dev_setup(char *line)
    {
    int i;
    char ch;

    ROOT_DEV = name_to_kdev_t(line);
    memset (root_device_name, 0, sizeof root_device_name);
    if (strncmp (line, "/dev/", 5) == 0) line += 5;
    for (i = 0; i < sizeof root_device_name - 1; ++i)
    {
    ch = line[i];
    if ( isspace (ch) || (ch == ',') || (ch == '\0') ) break;
    root_device_name[i] = ch;
    }
    return 1;
    }
    name_to_kdev_t( )就是把 device name string轉為 device MAJ/MIN number。
    kernel 認識的devname--MAJ/MIN 宣告在 root_dev_names[].

    root_dev_setup( ) 由cmdline設定好 ROOT_DEV 跟 root_device_name[].

    ..找到這裡對initrd而言好像有點不對..

    init/main.c/init( )
    do_basic_setup( );   由cmdline找到root的MAJ/MIN number
    prepare_namespace( );
    .

    完成!

    linux config時要enable RAMDISK, INITRD, EMBEDDED INITRD.
    進入magsi 特殊config時,要選 Embedded INITRD image.
    這樣build出來的linux.bin會包含linux kernel image 和 initrd (內含root ).
    用bootloader command : download net kernel linux.bin
    download到kernel target(特殊address)後。
    用bootloader command : boot kernel
    就可以執行了。

    從boot message可以看到mount initrd作root的動作。

    但是奇怪的是:console竟然不能用。不能輸入。
    在init.d中啟動telnetd,login是ok的。

    換一個ssh開啟minicom後OK。
    所以大概是VM的問題。


    這樣的作法在RAM足夠多,但是flash size不夠時可以使用。
    因為bootloader內含gunzip。所以整個root都可以zip起來,節省flash size。
    boot後再unzip到ram中執行。
    若是用romfs,因為無法kernel要直接mount,所以不能壓縮。
    順便說明一下bootloader的動作:
    這個bootloader要是要從flash中啟動,只有支援rootfs系統。
    bootloader在flash中找romfs keyword,當作romfs起始。
    再在romfs中找到linux.bin(.gz)。解開(或copy)到ram中,將控制權交給ram中的kernel。

    所以即使是 linux.bin 含 initrd,要燒到flash中讓bootloader boot。也要再pack成romfs,才可以燒到flash中(雖然這個romfs中只有linux.bin一個檔案)。

    星期一, 4月 03, 2006

    /dev/ttyS0 - group 是 dialout

    要用到command :
     uuencode file x > /dev/ttyS0
    將file經過uuencode後傳到serial port上,但是/dev/ttyS0有permission。
    查一下,ttyS0的groupe是dialout。
    所以要將user加入dialout的grope中,logout再login一次。

    還好吧...Blogspot 又出問題..

    一直連線不上,login進不去。

    網誌存檔