星期四, 4月 28, 2005

MPEG4LIVE : Media Node

Media Node是一個abstrate class,規定了基本的thread class:
Thread Body : int ThreadMain(void)
規定Node內必須有一個message queue和一個queue semaphore。
operation有
Start()
Stop()
StartThread()
StopThread()
SetConfig()
Media Node的Thread, semaphore operation使用了SDL library。

Media Source和Media Sink都是Media Node。


ref : mpeg4live

SDL : Simple Direct Media Layer

Simple Direct Media Layer提供對Video Audio、鍵盤、Mouse、控制桿、OpenGL 3D Hardware , 和2D video framebuffer作低階存取的跨平臺多媒體library 。廣泛的被 MPEG player、emulator, 和許多的game使用。

Simple Direct Media Layer 支援 Linux 、Windoes、BeOS, MacOS Classic, MacOS x, FreeBSD 、OpenBSD 、BSD/OS 、Solaris 、IRIX, 和QNX 。 有Code,但是沒沒有正式支援的平台有 Windows CE、AmigaOS 、Dreamcast 、Atari 、NetBSD 、AIX 、OSF/Tru64 、RISC OS, 和SymbianOS 。

SDL 是用C撰寫, 但可以直接使用在C++上, 並且支援其它語言, 包括Ada 、Eiffel 、Java 、Lua 、ML、Perl 、PHP 、Pike、Python, 和Ruby。

星期三, 4月 27, 2005

又要記了..

NB的driver CD要帶。

USB-232 cable.
tea bag.
茶杯
trackball.
book(arm - furber)
clean NB

星期二, 4月 26, 2005

MP4Live Internal 翻譯

程式控制

由沒有GUI的運作模式來看mp4live 比較容易瞭解。 在這個模式下, mp4live 讀 Config file, 然後根據Config file Create " Media flow",當"Media flow"啟動一些Thread之後main program 進入while loop,sleep一段時間,check是否要termintate。結束程式。


Media flow and Node

"Media flow" (media_flow.h) 是最高層,控制所有 mp4live 的活動的class。 Mediaflow 由許多Media Node集合而成(media_node.h), 每個node間都規定好互相傳送資料的方式。 每個 Node2. 都是mp4live 的一個thread process。 每個Node Thread都有一個message queue作為溝通的interface。 目前只有start,stop command經由這些queue來控制,還有當一比(一個media frame) ready時,利用的個queue來通知該thread可以開始處理了。Node之間的其他合作關係世界由shared configuration information data來達成。


Media Source

" Media Source" (media_source.h)是處理raw image data的node的Class,她根據configuration file將raw data轉換為需要的格式。"Media Source"可以用來產生(轉換)Video或Audio。Media Source可以同時將raw data轉換為多種格式,例如將video data轉為YUV 和MPEG-4。

因 為大部分的Media process都和Media的來源無關, Media Source class(media_source.cpp) 包含encode media ,加入同步time tag的code。現在的Media Process有點過度設計,可以用來轉換檔案和Capture device的輸出。

Audio 的Media Process有:

* Reframing PCM audio sampling。例如:將1152 PCM的MP3 reframed 為 1024 PCM 的AAC
* Resampling,降低sampling rate 和bit rate。
* Channel adoption : 將 立體轉為單音。
* 經由media codec作 encoding
* 將未處理的frame 轉送給其他process

Video的Media Process有:

* 將Colorspace 轉換從RGB24 到YUV12 。 一些Vedio capture只能輸出RGB,不能輸出YUV。
* Frame rate adoptin: down sampling 29.97 fps到24 fps
* Image resizing:將352x288 轉換為320x240的影像
* Image cropping: 將4:3 轉到到16:9 長寬比
* 經由media codec作encoding
* 將未處理的frame轉送給其他process


Midea Codecs


有 二種已定義的Media codecs (encoders):Video,Audio。定義在audio_encoder.h 和video_encoder.h,這兩個都是abstrat class,提供一個和encoder library溝通的inteface。Media Source使用Media Codec Class來作encode,將raw , uncompressed data轉換為encoded media。

每一個實際的codec都是由適合的 abstrator media codecs class derives自已的class,implement自己的interface method。

每 一個encoder都實作許多method,用來設定rtp transmission的變數或是設定將結果存為mp4檔案,各種編碼器類型並且有一定數量的電話設置各種各樣的可變物為 rtp 傳輸或挽救對mp4 文件。 這些method都宣告 audio_encoder.h 和video_encoder.h

將新的 encoder class加入到video_encoder_tables.h就可以增加新的video encoder,同樣的,將audio encoder加入audio_encoder_tables可以增加audio encoder。除了修改table之外,還要將hook code寫入audio_encoder.cpp和video_encoder.cpp中。


Media Frame


Media Source的輸出是Media Frame (media_frame.h) 。 這是一個被reference counted structure。包含 :一個指向malloc'ed 的Media Data,Media Data的長度,Media的Type,Media Frame的time tag,Media Frame duration(用在audio frame),Media frame的time scale。當create自己的Media Source,要在source間加入time tag。

Media Source在處理取得的media frame時,會產生很多media frame。 這些產生的Media frame會被包在message送到每一個向這個Source註冊的Media Sink中。要注意的是, 如果有 N Media Sink註冊需要這個Message,會有N個Message被create,但是都指向同一個Media Frame。Media frame會keep一個reference count,當有Sink free掉,count就減一,當count =0時,Media fram data會被free掉,這個frame也會被destroy。


Media Sinks


"Media Sink" (media_sink.h)從Media Source取得Media frame,並且把這些frame送到目的地(譬如file或network socket)。 迄今Media Sink對Media frame幾乎沒做處理。Media Sink的主要目的是利用獨立的Thread來避免寫入Media Frame到device時被block住,影響到Media frame的讀取(buffer用)。 例如:一個很糟的情況是Media Source不能跟上Video Capture的動作,Video Capture是不能"暫停"來等待Media Source讀取。要注意的情況是, 當Media Sink在對目標device(例如file或socket)寫入而被block時,新的Media frame會一直持續的放入她的queue中,如Media Sink沒有是當處置,最後系統 記憶將被耗盡。 同理,當Media Sink的動作跟不上realtime的Media flow速度,系統記憶體也會慢慢堆在Media Sink的queue中,最後耗盡。所以在Implement自己的Media Sink Class時要注意,要有write timeout功能,將memory release,避免導致程式不正常結束。

目前一個registered Media Sink會接受所有Media Source output的Media type,所以Media Sink要在class內部檢查Media的格式,reject (free) 它不想要的Media type。


Media Source List

V4L video_v4l_source.cpp
::從V4L (錄影為Linux) 設備獲取YUV12 圖像
V4L2 video_v4l2_source.cpp
::從V4L2 (錄影為Linux) 設備獲取YUV12 圖像(建議使用)
OSS audio_oss_source.cpp
::從OSS (開放伴音系統) 設備獲取PCM16 Audio Sample
self loop_source.cpp
::從Main process取得的raw的YUV 或PCM


Codecs List


Lame-> MP3 - audio_lame.cpp, installed from3.92 or later

FAAC -> AAC - audio_faac.cpp, installed from faac version 1.21 or later

ffmeg-> Mpeg layer 2, AMR NB, AMR WB, installed from ffmpeg (0.4.7 or later)

Xvid -> MPEG4 - video_xvid.cpp, mpeg4.ip/lib/xvid, or xvidcode 0.92 or later

Xvid 1.0 -> MPEG4 - video_xvid10.cpp,從xvidcode 1.0 RC3 or later

ffmpeg-> MPEG4, MPEG2, H263 - video_ffmpeg.cpp, installed from ffmpeg version0.4.7 or later(參拷README) 。


Media Sink List

MP4file_mp4_recorder.cpp
Writes media frames to an mp4 file
RTPrtp_transmitter.cpp
Transmits media frames via RTP/UDP/IP
Implements media specific RTP payloads as defined in IETF RFCs

An adjunct to the RTP transmitter is the SDP file writer (sdp_file.cpp) which constructs an SDP file that can be used to tune into the RTP streams

SDL Previewervideo_sdl_preview.cpp
Display video frames to a local video display
via the SDL multi-platform library
Raw Sinkfile_raw_sink.cpp
Writes raw media frames (YUV12 and PCM16) to a local named pipe
This enables sharing of the capture devices between mp4live and another application.

memo : available time

(三) 14:00,16:00
(四) 10:00,16:00
Next week:
(一)~(五)10:00,14:00
考慮一下。
看看能不能合併一天。

design draft : transfer file throufh tcp

datax ipaddr port totoalsize filename speed

建立socketfd.
建立sockaddr_in.
CONNECT
open and get size of localfile
master focus on sockfd. - 呆會select用
fread file in buf
send buf to sockfd

fread file in buf (MAX_PKT_SIZE)

星期一, 4月 25, 2005

偉大的CEO..


http://www.opera.com/swim/
所以當CEO,話就不能亂說...

VGA resolution

VGA : 640 x 480
SVGA : 800 x 600
XVGA: 1024 x 768

重新開張第一天

不過都增加'了些,
大概比較難有回應吧,
所以把地區增加了。
...就學荷蘭是拍賣,以周為單位,每週下降一點。
(真是自找的@#$%)

一早就有,別高興,是robot產生的。

下午開始有了,都是台北。
明天要決定了。

星期日, 4月 24, 2005

軟便記

NORMACOL PLUS GRANULES

分:100gSterculia‧‧‧‧‧‧‧‧‧‧‧‧‧62g

Frangula‧‧‧‧‧‧‧‧‧‧‧‧‧8g

用:長久以來刺激性瀉下劑使用後,會產生危險的副作用,如果長期使用會更干擾腸正常的蠕動,而本品是天然纖維產品,能自然保持腸正常的活動,避免刺激性瀉下劑造成的危險

適應症:習慣性便秘

注意事項:應飲用足量的水以避免腸阻塞,潰瘍性結腸炎者小心使

副作用:脹氣、腹脹

用法、用量:成人:每天1-2次,每次1-2包或1-2(使用5ml湯匙)7-14Gm,餐後使用
兒童:成人之一半
顆粒置於舌上,勿嚼或壓,配合充分水吞服。

星期四, 4月 21, 2005

今天的工作還是....

跟Jay到B1去作燒錄工作,,一樣,一天。

又....

杯子又倒了。
潑了一桌子,不過這次NB倒是沒遭殃,tackball倒楣了兩次。

奇怪,每次在有XX的念頭時,杯子都會倒,這是不是有什麼信息呢?

奇怪,主頁進不去...

清了cache後就OK了。

Framebuffer : Multi framebuffer device

check video_setup()的code,發現她只parse一個video=fbname... 的option。
所以就在boot argument寫兩個"video=" parameters.
video=vesa:ywrap video=vfb:font:5 vga=788
結果從boot message中可以看到vesa和vfb都啟動了。
# cat /proc/fb
0 VESA VGA
1 Virtual FB
可以知道都啟動了,而且VESA是fb0,VFB是1.
對/dev/fb0,/dev/fb1都可以作檔案操作。
但是console是VESA。

frame buffer : DirectFB

從DirectFB 的readme 看到。
一般的display card都會支援VESA Mode.
所以可以使用framebuffer的vesa driver.
首先要確認kernel有buildin(或有module) vesafb driver
(在menuconfig的console--framebuffer--vesa 選 * 或是M)
在boot argument中加入:
(以grub為例)
video=vesa:ywrap,mtrr vga=791

從vesa framebuffer的code : driver/video/vesafb.c中可以看到vesa mode支援的option.
   'ywrap' enables panning with wraparound.
'mtrr' enables setting caching type for the frame buffer to write-combining.
vga=791是設定顯示模式
This sets the mode on startup. 791 means 1024x768@16, 788 means 800x600@16.

All VESA Video Modes:

Bits 640x480 800x600 1024x768 1280x1024 1600x1200
8 769 771 773 775 796
16 785 788 791 794 798
32 786 789 792 795 799
所以以上boot argument會啟動vesa framebuffer,並且設定解析度是1024x768 16bit.
framebuffer啟動後,螢幕會變大(廢話),/proc/fb是 framebuffer資訊,
對/dev/fb0寫入資料會影響到螢幕。



身分證號碼檢查

在http://www.neo.com.tw/archives/000490.html 看到的

private boolean isIdNumber(String ID) {
boolean rule = false;
if (ID.length() == 10) {
ID = ID.toUpperCase();
byte s[] = ID.getBytes();
if (s[0] >= 65 && s[0] <= 90) {
int[] c = new int[11];
int a[] = {10, 11, 12, 13, 14, 15, 16, 17, 34, 18, 19, 20, 21, 22, 35, 23, 24, 25,26, 27, 28, 29, 32, 30, 31, 33};
c[0] = a[ (s[0]) - 65] / 10;
c[1] = a[ (s[0]) - 65] % 10;
for (int i = 1; i <= 9; i++) {
c[i + 1] = s[i] - 48;
}
int count = c[0];
for (int i = 1; i <= 9; i++) {
count += c[i] * (10 - i);
}
if ( ( (count % 10) + c[10]) == 10) {
rule = true;
}
}
}
return (rule);
}

A=65(ASCII)
Z=90(ASCII)

A=10 台北市 J=18 新竹縣 S=26 高雄縣
B=11 台中市 K=19 苗栗縣 T=27 屏東縣
C=12 基隆市 L=20 台中縣 U=28 花蓮縣
D=13 台南市 M=21 南投縣 V=29 台東縣
E=14 高雄市 N=22 彰化縣 * W=32 金門縣
F=15 台北縣 * O=35 新竹市 X=30 澎湖縣
G=16 宜蘭縣 P=23 雲林縣 Y=31 陽明山
H=17 桃園縣 Q=24 嘉義縣 * Z=33 連江縣
* I=34 嘉義市 R=25 台南縣

星期三, 4月 20, 2005

這篇不錯:Gmail的功能

http://home.educities.edu.tw/nightart2/gmail_note.htm

今天的工作是..

燒錄軟體,因為有一批燒錯了,所以要重新燒過。
大約....有600~1000 pcs吧!
因為生產線忙著生產,沒空,所以
2 engineers working on this.
----這是產業外移的結果?工程師比生產線的人員多?

bad news : 600台今天完工? 沒有多的pc用?
所以就是維持 2pcs/min ?
120 pc hr
5 hr working time.

星期二, 4月 19, 2005

Virtual Frame Buffer : vfb

原來只要將vfb compile in,並且在boot argument設定使用vfb。就會enable vfb.
但是因為這樣就以vfb作console,所以boot message都導入vfb而看不見了。
實際上vfb是ok的。

menuconfig Console加入vga text console.
enable virtual frame buffer.
*要及記得enable telnetd或ssh.因為啟動vfb後console就不見了,要用telnet來
控制。

在boot argument加入video=vfb:font:5
"video="開頭的部分會pass給video_setup( )。
video_setup( )會將"vfb:"開頭的部分pass給vfb_setup( )。
"font:5" 我也不知道要設多少,只知道vfb_setup( )只認識font:

boot到bios report memory後就停止了。
等HD停止。用HD來判斷boot complete.

telnet

dmesg可以看到vfb 的message:
"fb0: Virtual frame buffer device, using 1024k of video memory"

/dev/fb0可以當作是file作read/write動作
#echo 012345 > /dev/fb0
#cat /dev/fb0
012345

--------------------------------------------------------------

init/main.c : start_kernel --> setup_arch( )

setup_arch( ) --> conswitch = vga_con.
vga_con 宣告在driver/console_vga.c

猜測如Lu Sir所說,是console跑到vfb了,所以看不到boot message。
==> 啟動後用telnet試試。

menuconfig,將vga_text console 拿掉。build 看看。


Linux ignores input when using the framebuffer driver

Question:
When using the framebuffer driver the console output goes to the LCD display, but I cannot input anything. What's wrong?

Answer:
You can define "console devices" using the console= boot argument. Add something like this to your bootargs setting:
... console=tty0 console=ttyS0,$(baudrate) ...
This will ensure that the boot messages are displayed on both the framebuffer (/dev/tty0) and the serial console (/dev/ttyS0); the last device named in a console= option will be the one that takes input, too, so with the settings above you can use the serial console to enter commands etc. For a more detailed description see http://www.tldp.org/HOWTO/Remote-Serial-Console-HOWTO/configure-kernel.html

...

星期一, 4月 18, 2005

Module __SETUP : kernel boot argument

在Module中有一些會有類似
__setup("video=",video_setup);
這樣的宣告,意思是將kernel boot argument中有video=???的部分交給video_setup( )這個function.
這樣啟動時也可以將參數通知Module。
像video=這一個boot argument就是用來通知framebuffer module (fbmem)。
video=scrollback:120k map:1234 vc:1-4 vfb:font:3
從source code上看來各option好像要照順序。
,
follow 這個 link,奇怪的是怎麼make bzImage後make clean ?
然後make modules, make modules_install,copy bzImage到boot。

就是這個make clean的位置很奇怪。
結果:當然是寫錯了,如果要clean的畫,是在 make dep之後。

超清楚- 編譯核心(其實還包括module,initrd和grub)

參考標題的link,是從study-area來的。
步驟大概是:
  1. build kernel
  2. build module
  3. build initrd
  4. modify GRUB
---------------------------------------------
make menuconfig - uncheck module-version-xxxx
make dep
su
make bzImage (11:05 ~ 11:12)
--Makefile中有 include arch/$(ARCH)/Makefile
--這個Makefile就有bzImage targe
--其實bzImage就是到arch/i386/boot下run make bzImage
--bzImage的depend target是vmlinux
--OK在arch/i386/boot下有bzImage.
cp /arch/i386/boot/bzImage /boot
--將bzImage copy到開機目錄

make modules
--如果version number沒變,要先將library module rename
--mv /lib/modules/2.4.18-20 backup
make modules_install
--在/lib/modules/下產生一個2.4.18-14customm,好像要rename成2.4.18-14
depmod -a
--如果沒有message顯示,代表module ok
--如果有?


Install RH8 again

為了要測試framebuffer driver,為了避免重裝BlueCat 環境,所以new create一個vm.
安裝minimal package for kernel developement--- X都不裝。
---這樣竟然也要快0.9G.
09:55開始
10:10結束
disk 1-3.

向陽農場


現在的花 是薰衣草和金魚草。
但是去看,薰衣草已經都沒了。
剩下金魚草。

向陽農場


..走66號到7.5km處(其實大約在8.x km處就要出來了)。
有個7-11又轉。
延路標就可以走到
(要記得回來的路,因為回來沒有路標)。
雖然網站說停車場不收費,但是實際上沒有停車場。
所以只好去附近的停車場。
花不多,沒有一望無記的感覺。
這個...應該很難稱下去吧...

星期五, 4月 15, 2005

chroot後symbolic link不能用的問題:

作者: kenduest (小州) 看板: Linux
標題: Proftpd會看不到連結目錄嗎?
時間: Tue Sep 3 01:50:05 2002

※ 引述《MarsJn.bbs@bbs.cju.edu.tw》之銘言:
> 使用ln作出的連結目錄,在proftp會看不到嗎?

我想您應該是問到一個匿名登入後,發現 symbolic link 失效的問題。

由於匿名登入下,ftpd 會呼叫 chroot() 將某個目錄作為匿名登入
環境下的更目錄,比方系統實際上是使用 /var/ftp 當作匿名登入後的
/ 目錄。

在該環境下,若是您有建立 symbolic link 檔案連結超過 /var/ftp
目錄外的話,那當然會失效。若是您 建立 symbolic link 檔案,其
連結目的還是在 /var/ftp 裡面相關目錄的話,應該使用相對路徑而
不是絕對路徑。

若是您真的有需要連結 /var/ftp 目錄外的目錄,應該考慮使用
mount --bind 的方式把目錄掛入到 /var/ftp 裡面。比方:

mount --bind /home/blah /var/ftp/pub/share

mount --bind,需要在 kernel 2.4 後才可以使用。

奇怪的問題:Recvfrom: Resource temporarily unavailable

Lu Sir用busybox的ftp來download,發現有些file不能download,
他用文字檔測試,發現跟file size有關係。--加上一個字就OK。
發現跟4的倍數有關,不行的檔案+1,+2,+3都可以,+4就不行。
dmesg的結果顯示UDP checksum error.

BlueCat linux 4.1, linux kerenel 2.4.18 arm.

framebuffer fb_mmap() in fbmem.c

fbmem.c的fb_mmap()是application的mmap()function.
他先check device有沒有implement mmap,如果有就執行device的mmap,
如果沒有就執行fbmem default的mmap:

start = fix.smem_start; // fd的fix data: fb的start address
off += start;
vma->pgoff = off >> PAGE_SHIFT;
...
io_remap_page_range(vma_start,off,
vma->vm_end - vma->vm_start, vma->vm_page_prot);

其中io_remap_page_range( )在asm-arm/io.h中define為
remap_page_range(from, physic,size,prot)
所以實off就是physical address,這個address在mmap return時會藉由vma->vm_pgoff
轉成return value傳給caller application

struct vm_area_struct

struct mm_struct *vm_mm; 所屬的address region(address)
unsigned long vm_start; 在vm_mm中的起始位置
unsigned logn vm_end; 在vm_mm中的結束位置+1
...
pgprot_t vm_page_prot; 存取權限
unsigned long vm_flags; flags
..
struct vm_operations_struct *vm_ops; 處裡的function pointer
...
unsigned long vm_pgoff; 映射起始位置是在vm_file的?offset.
struct file *vm_file; 映射的file

星期四, 4月 14, 2005

又忘記,所以再寫一次:find grep

找 gbt_t是在哪裡定義的

grep gbt_t `find src`

mmap : mmap a file

void *mmap(void *start,size_t length,int prot,int flags,int fd, off_t offset);
start : 要把記憶體放哪?如果是0代表請system決定。
length : 要把fd的多少大小(長度)映射到記憶體。
prot : 保護方式

PROT_EXEC : 可被執行
PROT_READ : 可被讀取
PROT_WRITE : 可被寫入
PROT_NONE : 不能存取

flag : 特性

MAP_FIXED : 如果start指定的位置無法被映射則放棄
MAP_SHARED : 寫入資料到映射區會寫回fd內,供其他process使用。
MAP_PRIVATE : 對fd作複製,所有動作不影響到fd.
MAP_ANONYMOUS : 忽略fd,和檔案無關。
MAP_DENYWRITE : 只允許經由映射區作寫入,不允許其他process對fd寫入
MAP_LOCKED : 鎖定映射區,不被swap out

offset : 從fd的offset位置開始映射,必須要是分頁大小的整數倍。

return code
成功則傳回映射的起始位址,否則傳回MAP_FAILED(-1),原因再errno中。


#include <sys/mman.h>
#include <stdio.h>
#include <fcntl.h>
int main(int argc,int *argv[])
{
int fd;
char *mapped_mem;
const int len=100;
int i;

fd = open("testfile",O_RDWR | O_CREATE);
lseek(fd,length+1,SEEK_SET);
write(fd,"\0",1);
lseek(fd,0 ,SEEK_SET);

mapped_mem=mmap(0,len,PROT_WRITE,MAP_SHARED,fd,0);
close(fd);

for(i=0;i<10;i++)
mapped_mem[i]='0'+i;

return 0;
}

執行後會產生testfile檔,cat後會是
1234567890

HTML Tag: PRE

用<pre>和</pre>刮起來的區域好像會依照縮排方式

空一格
空兩格
空三格

雖然比較方便,但是顏色好像都會灰灰的。

arm linux bootloader

好像要注意的地方有很多,先看一下Documentation/arm/Booting

To understanding Linux VMM

從out of memory module : mm/ook_kill.c
因為這個module和比較獨立,這module的工作在memory low時選一出一個process來kill。

接著non-contiguous memory allocator: mm/vmalloc.c
physical page allocator : mm/page_alloc.c
creation of VMAs and memory area for process

以上的部分在其他VM的部分都會大量的使用到。所以先了解有助於了解其他的code。

--------------------------------------------------------------------------------------

NUMA (Non-Uniform Memory Access)
  硬體的memory有區分,例如:每一個CPU旁都有一塊memory,CPU取用起來比較快。
  DMA旁有一塊。

Node : 每一塊有區分的記憶體都是一個Node。 用pg_data_t 來表示。
 所有的pg_data_會被串起來,在pgdat_list。
 以x86來說,是UMA(uniform memory access),也就是說,
 他只有一塊memory,
 所以x86的linux系統,他的pgdat_list只有一比資料(一個Node)。
Zone :Node又被分成很多小塊(通常依照address分割),叫Zone,
 用zone_t紀錄。
page:每個Zone又被分成很多page,表示的data structure就是
 page所有的page倍放在mem_map[]

GPD (Global Page Directory) : 每個process都有一個GPD。

About diff

奇怪的是這是從"Understanding Linux Virtual Memory Management"上看到的。
-----------------------------------------------------------------------------------
diff會產生單一檔案,內容包含所有的file difference.
diff產生的結果檔是由很多小區塊組成,
每一個區塊由@@開始,標明startline of code,還有修改前,後的source line數,
接著還會顯示修改的code 前面和後面部分的code,讓人容易了解。
每一行由+,-或是空白起頭。
+ 表示要加入這一行
- 表示要刪除這一行
空白代表這一行維持不變

以下是linux kernel pathc一般的rule
一般linux的diff都是

星期三, 4月 13, 2005

Qt/Embedded - low level classes

Qt/Embedded 的圖形繪制操作函數都是由 src/kernel/qgfxreaster_qws.cpp 的 QgfxRasterBase 發起。
更加底層的抽象描述則在src/kerne/qgfx_qws.cpp的Qscreen 中定義。
對framebuffer直接操作,包括點、線、區域填充、alpha混合、屏幕繪制等。

用hyperterminal送hex的方法

還是用"傳送文字文件"來送。
文字文件用ultra-editor編輯hex內容。
file存成txt檔(雖然不是txt內容)。

-------這是Jay提供的

星期二, 4月 12, 2005

vesafb

vesafb是給VESA2.0的intel graphic card用的,
vesafb提供bitmap console的功能(graphic mode w bitmap fonts)
但是vesafb不能用在VESA1.2 card,因為VESA1.2 card的frame buffer不是linear。

Linux Framebufer driver writting howto

Framebuffer Internal API
舊的api讓console的code和frame buffer driver link在一起,新的driver將console code移到fbcon
fbcon將顯示卡的功能包起來,讓vt console和device drvier可以分開修改。
一個最好的例子就是virtual framebuffe : vfb。
vfb並不是真正的graphic card,他只是將memory mapping到user space,
有關每個function的內容,可以參考linux/drivers/video/skeletonfb.c。

Data Structure

framebuffer有4個比較重要的structure,都宣告在 fb.h
fb_var_screeninfo
fb_fix_screeninfo
fb_monospecs
fb_info
fb_var_screeninfo : 可以設定的資料,向color depth,resolution。
fb_fix_screeninfo :不能設定的資料,向framebuffer start address
fb_monospecs :避免user program作一些硬體不容許的動作,例如不正確的resolution。
fb_info : 硬體的資料,和card關聯在一起,例如一個有2個output的card,那就會有兩個fb_info,fb_info只有kernel看得到。

Driver Layout

vfb.c是一個比較清楚的範例。

Initialization and boot time parameter handling

啟動時會執行的function有:
int xxfb_init(void);
int xxfb_setup(char*);
上面的function,通常在寫好後,藉由fbmem.c這個code的宣告,在load時link到kernel裡:
static struct {
const char *name;
int (*init)(void);
int (*setup)(char*);
} fb_drivers[] __initdata = {
#ifdef CONFIG_FB_YOURCARD
{"driver_name",xxfb_init,xxfb_setup},
#endif

xxfb_setup(char*)是在kernel boot時使用的,例如,用bootloader開機時同時下達以下參數:
boot: video=matrox:vesa:443
這個video的string會被傳給setup( ) function.

setup function一般是這樣:
int __init xxfb_setup(char *options)
{
char *this_opt;
if(!options || !*options)
return 0;

for(this_opt = strtok(options,","); this_opt;this_opt=strtok(NULL,",")) {
if(!strcmp(this_opt,"my_options")) {
....do something your options want....
&nbsp}else if (!strncmp(this_opt,"other_options:",5))
...
}

另一個function : xxfb_init( ) 設定好video card的initial state,還要處理bus的相關動作(pci,isa或none)

星期一, 4月 11, 2005

Source Navigator 5.2b2 1不認識中文檔名

在桌面的source folder因為path有"桌面"兩字,
所以build project時會會出現error,當機。
但是將project file放在source folder裡就可以(猜測是 "."),
但是add more folder,其他的folder就reference不到。

星期五, 4月 08, 2005

晴天霹靂...

今天是發薪日..
竟然跟當初談的不同,差太多了,
還有10%是績效獎金,依業績成率決定。
----這點沒講

並不是不接受,只是當初面試沒說,
發薪日才說,感覺有點被騙。

看來又要開始找工作。
其實我還有點喜歡這個工作。
PCI
Bus CLK :25 or 33MHz
Bus Width: 32 bit
Autodetetion of interface board (Jumpless)
Automatically configured at boot time
device driver can access the configuration information in the device

Addressing
peripherial is identified by a bus number, a device number, a function number.
each PCI domain can host up 256 buses.
each bus can hosts up 32 devices.
each device can be a multifunction board with a maximum 8 functions.

each function can be identified at a hardware level by a 16-bit address, or key.
Linux device driver doesn't need to deal with these binary address, it uses a specific
data structure, pci_dev to act on devices.

command "lspci" and the file "devices" in /proc/bus/pci/ shows all pci peripherial datas,
$lspci
00:00.0 Host brigde
00:01.0 ISA bridge
00:07.0 IDE interface
....

The hardware circuits of each peripherial board answers queries pertainning to tree address space: memory location, I/O and configuration registers.
memory locaion and I/O are all the same for every bus. so queries one bus at one time.
then won't collid.

Memory and I/O are accessed in the uaual way via inb. configuration transations are performed by
calling specific kernel function to access configuration register.
Every PCI slot has 4 interrupt pin. each function can use

星期四, 4月 07, 2005

About BlueCat 4.1

剛剛試了BlueCat for arm....

BlueCat還真利害,除了linux kernel部分有source code,其他的一律沒有,
所有root file system需要的都已經build好,包刮busybox,所以全部都沒有source code。
....這違反GPL吧,特地查了一下busybox,真的是GPL license....
一般embedded覺得麻煩(有趣,有用)的部分:root file system,BlueCat提供了自己
寫的program:
mkrootfs : 產生,加入,parse share library,strip debug information...etc
mkboot : 配合BlueCat的bootoader.
當然,也沒附source code。這倒是不違反GPL。(不過顯得小氣而已)。

cross developement tool都已經build好,也寫了script設定environment。
沒看到library的selection和build,所以?一律使用glibc?

結論:

明明都是open source的東西,但是都

用Linux的原因..

今天在Cnet看到的:
Our customers have an aversion to putting Microsoft in any of their devices. They're not interested in seeing Microsoft usurp value from their devices
.....
Microsoft's entry in the set-top box market. They're not just interested in being a software supplier; they're interested in taking over the business altogether.
-------------------------------------------------------------------------
就像smartphone,剛開始只有一家,超強的一家(現在還是很強)。
但是當MS在這一家累積了經驗後,他的software platform越來越完整,
接著就有很多家出來了,因為只要(也只能)follow MS的規定和referecence design
就可以作出smart phone來了。
而且重點是,隨著MS在market上累積的經驗越來越多,他的developement
platform越來越完整,各家的差異也越來越小了。
最後smart phone就像pc一樣,像郭說的一樣,不是電子業,而是機構,組裝而已。

所以要為MS工作嗎?
還是使用Linux,保持多樣性和維持自己的優勢?

Ghost 2005 (9.0)

今天試裝了一下Ghost 2005,發現竟然警告我RAM不足?!
因為這是Notebook,只有256M RAM(真的是少了一點)。
不過目前NB的一般規格都是256M。
Ghost說可以執行輩分,但是run restore disk的畫就需要256M了。
真慘,256 Onb share w Graphic,所以當然不足256囉。
能backup不能restore的東西等於沒用,
那就...看看使用說明好了。
哇!竟然還要裝.NET。
唉!一個backup的工具也要搞得這樣大的陣仗。
還是算了。別試了吧。
.
.
早上寫的這篇,下午MIS就通知windows又有重要更新了,
是針對.NET framework,
我update了一下,發現我不需要,
還好沒裝.net。
因為我google了一下這個"重要更新",
發現有很多問題,包瓜讓IIS無法動作。
.
還好,我沒為了Ghost裝.net。

百慕達之謎已找到線索


有魔鬼三角區之稱的百慕達海域不知吞沒了多少船隻,航行者提起這個地方就發
毛,因為十多年己有一百多架飛機,兩百多艘船在此地失蹤,奇怪的是殘骸始終找不
到,有時連派去溲索的飛機和船隻也一去不回,所以此地也叫死亡之域或死亡三角區。

死亡三角區是如何埋葬船和飛機呢﹖過去一直是不解之謎,近來科學家努力討究,
似乎己找到線索。

原來百幕達三角區海域潮流向是個大旋渦,旋渦轉起來像一塊凹面鏡,此鏡經陽光
照射,陽光被聚焦,焦點周圍溫度上升到萬度,所以過往船隻和飛機都融化掉了。


科學家作以下試驗,一個大浴盆裝滿水,然後攪動,讓水湧起旋渦,再令強烈聚光
燈以十六到七十五度入射角照射旋渦,不久奇蹟出現了,一張懸在浴盆上空薄紙突然燒
起來,接著科學家把旋渦直徑加大到一百公尺,引入太陽光,發現陽光焦點直徑有一公
尺以上,焦範圍溫度高到萬度。

百慕達三角區旋渦直徑據說有好幾千公里,生命長達六十多天,在陽光以十度到七
十五度角入射時,焦點周圍直徑可達到幾百公尺到上千公尺,其焦點周圍溫度超過萬
度。

所以飛機,船一入焦點地區,頃刻間化為烏有。即使進入高溫區邊緣,也會引起爆
炸和燃燒。
=========================================================
以上是從這裡copy過來的。

星期三, 4月 06, 2005

新名詞: SOA

SOA(service oriented architectures) 服務導向架構
雖然知道名子了,可是還是不知道是要幹麻的?
是最近流行了用XML方式提供web api供外界操作?
不知道,至少不是DOA (death on arrive)就是了。

CCD: Color Rolling

CCD常常會有閃動和顏色週期的變化,這是因為自動白平衡的關係。
自動白平衡根據影像的色分布扭曲色平衡,藉以改變顯示的色偏。
因為是一種回授的動作,所以很容易產生震盪。造成顏色週期的改變。
自動白平衡實驗:
將CCD對準藍色牆壁,慢慢將白紙深入拍攝範圍中,
可以看到白紙的顏色隨著深入的量而改變。

星期一, 4月 04, 2005

星期六, 4月 02, 2005

Some Keywords.

decimation filter
chroma level

resize 要用 bicubic 還是 bilinear?

這是從PCDVD copy過來的
作者是Shade.

--------------------------------------------------
resize 要用 bicubic 還是 bilinear?
----------------------------------

好問題

也許有人看過 Nicky 寫的這篇:
http://nickyguides.digital-digest.c...-vs-bicubic.htm

他的建議是
放大用 bicubic
縮小用 bilinear

一般我們做 DVDRip 的時候都是用縮小 resize,放大留給播放的時候再去放大。

縮小 resize 的計算步驟
1. pre-filter
2. 座標變換
3. post-filter

resize 的時候,要計算像素的座標變換,例如 704x480 -> 320x240,
新畫面座標 (99,99) 這個點對應到原畫面,是 (217.8,198) 這個點,
落在原畫面的整數像素之間。
704/320 = 2.2
x = 99*2.2 = 217.8

480/240 = 2
y= 99*2 = 198

所以 (99,99) 對應的 (x,y) 是 (217.8,198)

當然原畫面是沒有 (217.8,198) 這個點的數值,那我們要計算這個位置的像素值應該是多少,
也就是對應過來的新畫面座標 (99,99) 的像素值是多少。
那要怎麼計算這個在像素中間的值呢?
我們會利用內插法,也就是利用這個點周圍鄰居的像素值,來推算這個位於像素中間的數值。
這個內插法使用的 interpolation filter 也就是步驟三的 post-filter,
常見的有以下幾種方法:
1. Nearest neighbor: 最近鄰居法,就是很簡單的直接拿最靠近的鄰居(像素)數值來使用。

2. bilinear: 使用周圍 2x2,4 個鄰居做垂直、水平的線性內插。

3. bicubic: 使用周圍 4x4,16 個鄰居來做內插,內插的算式比較複雜,按距離的遠近有不同的權重。

縮小的時候會發生一種瑕疵叫做 aliasing,也就是原本的高頻被當成低頻訊號,
使得縮小後的低頻出現不正確的結果。
從畫面上看起來 aliasing 會造成 moire 和 鋸齒,線條會一格一格的很難看。
解決的方法是步驟一,先用一個 pre-filter 濾掉 resize 後無法正確記錄、
會引起 aliasing 的高頻訊號,然後再 resize,這樣就可以解決 aliasing 的問題。

但是這個 pre-filter(也就是一個 low pass filter)的設計有兩個困難。
不同種類的 filter 濾除高頻的特性不一樣,有的會造成畫面模糊。
如果 filter 的 tap 數越高(計算的像素個數越多),計算越精確,
品質當然越好。但是 tap 數太高,會造成另一種瑕疵叫做 ringing effect,
所以這個 filter tap 數不能太高。
但是如果 tap 數太低,無法無法良好的濾除高頻,又會發生 aliasing 的瑕疵。
所以這是一個兩難,必須視縮小率來調整最恰當的設計。

Avisynth 的 bicubic 設定
# BicubicResize(clip, int target_width, int target_height, float "b", float "c")

其中參數 b 代表模糊的程度,c 代表 ringing 的程度。
預設值是 b = 1/3, c = 1/3。
b = 0, c = 0.75 等於 VirtualDub 的 "precise bicubic"。
Avisynth 建議,理論上保持 b + 2 * c = 1 會得到最正確、最適當的 filter 結果。
例如 b = 0, c 便要 = 0.5,如果 c 超過 0.5 就會產生 ringing 瑕疵。

bilinear 的畫面比較模糊,但是也比較好壓縮,做 1 CD 的時候,用 bilinear 會比較好。
SimpleResize 這個 resize 法就等於 bilinear 拿掉 triangle filter,
所以它的畫面會比 bilinear 銳利一點。
如果你的畫面本來就很銳利,用 SimpleResize 縮小,那麼就會出現 aliasing 瑕疵。


前面的討論中,我們有提到一個 resize 的王者,叫做 lanczos3。
這個 resize 法是一種 decimation filter,本身具有 low pass 的效果,
也就是使用 lanczos windowed 的 FIR Low Pass Filter,它的 tap 數會根據縮小率
自動變化,在清晰度和 ringing effect/aliasing 等瑕疵之間取得最佳的平衡點。
所以 lanczos3 等於自己是一個完美的 low pass filter
根據大家的實驗,lanczos3 可以保留最多的細節,而又不會造成太大的壓縮困難,
所以建議如果流量夠的話,用 lanczos3 可以得到最佳的結果。
相關討論,可以看日本的網站或 Doom9。

另外,lanczos3 處理放大,效果也很不錯。
放大縮小都行,所以說它是 resize 的王者

星期五, 4月 01, 2005

不可思議的事..

  1. 網路商店: 以伺服器、使用者與付款處理系統,或是用戶端、伺服器架構 透過網路販賣物品 - EP803105EP738446
  2. 以行動電話訂購: 透過行動電話網路銷售物品 - EP1090494
  3. 購物車: 電子購物車 - EP807891EP784279
  4. [CDs] [Films] [Books]: 分頁標籤 - EP689133
  5. 圖片連結: 預覽視窗 - EP537100
  6. 檢視/下載影片: 透過網路傳送視訊資料 - EP933892
  7. 觀看影片: 視訊串流 (「根據需求提供視訊片段」) - EP633694
  8. MP3 格式: 被好幾個專利保護的音訊壓縮格式, 像是 EP287578
  9. 信用卡: 透過 Internet 以信用卡付款 - EP820620EP779587
  10. 禮品: 提供他/她的 Email 位址,透過 Internet 為某個人訂購禮品的專利 - EP927945 (留意: 這個連結所聲明的內容比較狹窄;最後通過的專利內容在 B1 form)
  11. 申請貸款: 自動申請貸款 - EP715740
  12. VISA: 圖片的數位簽章,以顯示商店能夠接受 VISA 信用卡付款 - EP798657
  13. 傳送優惠訊息: 回應需求、提供特殊優惠的專利 - EP986016
  14. 送到廠商: 把收到的訂單轉給廠商 - EP217308
  15. 支援資料庫: 使用資料庫的網路支援系統 - EP673135
  16. 預覽章節: 以電視暗喻選擇不同影像片段 - EP670652
  17. 金龜子圖片: JPEG 格式 - EP266049
  18. 相關結果: 顯示客戶可能感興趣的相關結果 - EP628919
  19. 折扣碼: 讓客戶輸入折扣代碼 - EP370847
  20. 由商店燒錄: 在遠端重製實體資訊的專利 - EP195098

完工

standard & oem version都好了,follow Lu sir的指示,寫在同一個source code裡。
大概就是
  1. 將menu definition移到external flash
  2. 將字型由8x10改為8x12
  3. 增加oem的keyboard control protocol
  4. command forward
  5. out port baudrate setting
其中2~5都是因為1才可以做的,因為on chip的flash size不夠了
...所以這都是自找的 orz....

GCC attrib: naked

C function經過compiler compile後都會在function entry,exit加入一些code,如save used registers,add return code.
但是如果不想要compiler加上這些code,就可以在function宣告時加上attribut : naked

void funA(void) __attribute__ ( (naked))
{
...
asm("ret");
}

這樣compiler就不會加code,但是也因為這樣,programmer自己要在最後加上return code。

這通常是在os kernel時使用,例如context switch function,programmer要自己處理context save
restore的動作。
http://www.freertos.org/implementation/a00012.html

http://www.freertos.org/implementation/a00013.html
有說明和範例

解夏

從前,印度的佛教僧侣們平時是靠著四處走動來宣揚佛法,也藉此修行。四月十六,印度的夏季開始,這一天,也同時是雨季的開端。雨季,正是蟲卵孵化、草木發 芽的時節,釋迦牟尼佛擔心僧侶們在這段時間內外出會踩壞了蟲卵與嫩芽、犯了殺生大戒,便把僧侶們集合到「結界」(寺院的前身),讓僧侶們在這裡「安居」 (禁足),專心講經修道,不得外出。平日雲遊四海的僧侶們,此時必須靜下心來,曬起草鞋,放下錫杖,守著空屋,即使碰到相識之人,也只能裝作不認識。這段 時間,就是所謂的「結夏安居」,僧侶們除了每日按時唸經誦佛、講經講律講論之外,還要遵守比平常更嚴格的戒律,不准爭吵、不准詆毀、不准看其它書籍、不准 不用心聽講...否則就要被趕出結界。這段單調寂寞、刻苦修行的「結夏安居」為期九十天,直到七月十五日結束,結束的那一天,稱為「解夏」,從這天開始, 一切重新開始,宛如新生。

http://blog.sina.com.tw/archive.php?blog_id=112&md=entry&id=12833

網誌存檔