星期四, 3月 09, 2006

nano-X source trace

developement/config.microwin
FRAMEBUFFER = Y
FBVGA = N

Makefile -- Makefile.rule 才是依照config.microwin 下option的file。

從build output知道driver是用scr_fb.c



srvmain.c : main( ) --> GsInitialize() -->GdOpenScreen()

engin/devopen.c : GdOpenScreen() -->scrdev.Open( )

driver/scr_fb.c : fb_open() :
if(!(env=getenv("FRAMEBUFFER")))
env="/dev/fb/0";
fb= open(env,O_RDWR);
回到nanox/srcmain.c:
main 的GsInitialize( )在open screen 前先GsOpenSocket( ),Device都open完後,就進入GsSelect( ) endless loop。

GsSelect( )的實做依照taregt platform有VXWORK, MINIX, UNIX ,這裡使用的是UNIX版本的實做。

GsSelect( ) set需要SET (WAIT)的file:FD_SET(un_sock..) keyboard, mount..然後用 select( ) 等待file change,用FD_ISSET 找到改變的file。

用GsOpenSocket( ) open的name socket : un_sock,的response action是 GsAcceptClient( )

srvnet.c : GsAcceptClient(void) -->GsAcceptClientFd(i)
srvmain.c : GsAcceptClientFd(i) : 將Client Fd link到 root_client 這個linking list中。

在GsSelect( )中,會一一用ISSET check所有root_client的fd.然後用GsHandleClient( )處理。

srvnet.c : GsHandleClient( int fd)
讀入fd message,parse data,取出 reqType,
執行GrFunctions[ ] functiontable對應的function
client application 都在demo/nanox中,Makefile有link到NANOXCLIENTLIBS,
定義在 Makefile.rules , = libnano-X.a

這個library build在 nanox/Makefile

Create rule在Makefile.rule:
$(MW_DIR_LIB)/$(LIBNAME): $(OBJS) $(CXXOBJS)
@echo "Creating library $(patsubst $(MW_DIR_LIB)/%,%,$@) ..."
$(AR) $(ARFLAGS) $(MW_DIR_LIB)/$(LIBNAME) $(OBJS) $(CXXOBJS) $(ASMOBJS)
可以看出libnano-X.a的組成.. OBJS , CXXOBJS ASMOBJS
用arm-elf-ar -t libnano-X.a
nxdraw.o
nxutil.o
nxtransform.o
client.o
nxproto.o
error.o
clientfb.o
都在nanox folder中,接著,就可以到demo/nanox下的client program,一邊看code,一邊查server端的對應function

查到對應clientlib內的function都是用
reg=AllocReq(-NAME-) 將command 包裝起來。
之後填好req的參數內容,再叫
TypedReadBlock( )-->ReadBlock()-->nxFlushReq( )
由nxFlushReq將Req填入Socket中。
.


demo2.c:
GrOpen( ) :
GrSetErrorHandler(NULL);
w=GrNewWindow(..);
GrSetWMProperties(..);
gc=GrNewGC();
font=GrCreateFont(..);
GrSetGCFont(..);
GrSelectEvent(..);
GrMapWindow(..);
GrSetFocus(..);
for(;;){
GrGetNextEvent( );
switch (event.type) {
case GR_EVENT_TYPE_EXPOTURE:
GrSetGCForeground( );
GrFillRect( );
GrSetGCForeground();
GrSetGCUseBackground();
GrText( );
GrRect( );
break;
case GR_EVENT_TYPE_CLOSE_REQ:
GrClose();
exit( );
case ...
}
所以可以看出實際上畫window的動作是要自己做的,nanox只提供message passing的機制。

這個會不會太辛苦...像Windows SDK..



一啟動nano-X 後,screen會被覆蓋掉,所以會覆蓋video output。要設定alpha=0。
nanax/srvmain.c:main() 有設定root windows的backgroud = BLACK。
查到BLACK是在mwtypes.h中定義。
另外有定義 MWARGB(a,r,g,b),就用這個來設定background。
將wp->background = BLACK改為MWRGB(0,0,0,0)
果然OK。load nano-X後video out依然OK。

沒有留言:

網誌存檔