1.30.2007

USB USBET Compliance Test

要進行USBIF的USBHSET (High Speed Electrical Test)。
在USBIF可以download..

device 要支援 SETUP Command中的 SET_FEATURE (0x03) 。

CE中,由Pdd的 Interrupt Stub Thread,SETUP packet handler 呼叫 Mdd_Notify( ),請Mdd處理SET_FEATURE request (其實所有request都是Mdd處理的)。

Mdd_Notify 和其他Mdd_XX 在不同的source file中 - usbfn\controller\mdd\enum.cpp.

Notify 呼叫 ProcessRequest( )處理 SEQUEST packet。

奇怪的是..SET Feature function - ProcessRequest( )竟然只處理 SET_FEATURE_COMPILANCE。

SET_FEATURE Request的 wValue Low Byte 決定要Set的feature:
  • 0x00 : Endpoint Halt. -- 什麼都不作.
  • 0x02 : Test Mode。wValue High Byte決定要設定device的test mode:
    • TEST_J - 將D+, D- 設定成J State.
    • TEST_K - .....
    • TEST_SE0_NAK - 將D+, D- 設定在SE0_NAK
    • TEST_PACKET - 送出一個56 bytes的packet (內定好的),然後進入PRBS state.
      "送出" 的動作還是依照USB 的規範,在IN stage時送出
    • TEST_FORCE_ENABLE - 送出NAK
進入TEST Mode之前,還是要回應一下SETUP Command (Handshake - ACK)。
做完TEST Mode的動作後,因為USB state已經混亂,所以就進入while(1); loop,當機..

1.29.2007

No Public key available for the following key IDs:

有時候,變更sources.list,作 apt-get update時,最後都會出現
There are no public key available for the following key IDs: A70DAF536070D3A1
google說..用
sudo gpg --recv-key --keyserver wwwkeys.eu.pgp.net A70DAF536070D3A1
sudo gpg --export A70DAF536070D3A1 | sudo apt-key add -
就ok了。

其實我不知道為甚麼要作這個 :P

ISP1582 Interrupt Handler - BRST

由polling mode轉移到interrupt mode :

interrupt 發生的順序依次是..
  1. VBUS
  2. RESUME (don't care)
  3. RESUME + SUSPEND (don't care)
  4. BUS RESET
  5. HS_STATE (High Speed State Change)
  6. EP0SETUP (reveiced)
其中由BUS_RESET 到HS_STATE比較多動作要作,也就是說,在interrupt handler中,處理 BUS RESET 中斷時,比較多事情要作,如果沒做好,下一個 HS_STATE就不會進來..

參考data sheet,所有register 除了一般的Reset, Access外,還有一個"Bus Reset"。
代表該bit 在 Bus reset後的狀態 (數值,或是unchanged)。

重要的幾個register :

Mode Register
  • CLKAON : core clock always ON。這個bit在bus reset後會被clear to zero。
    clock always on 跟 unlock 動作有關。ISP1582 內部有一個省電功能的timer,當有一段時間沒有access chip,他會自動timeout,這時候,在access chip register之前,要先寫入unlock register,啟動PLL。
    所以如果沒有將CLKAON社為1。進入interrupt handler之前就要先unlock。
    如果有將CLKAON設為1,就不需要unlock。
    這個bit在bus reset後會被clear,所以要重新設定。
    *為了怕麻煩,還是設定得好。
  • WKUPCS : 這個...是設定"只要chip select有動作,就自動wakeup chip"。
    Bus Reset後會被clear,sample code有設為1。
Interrupt Enable Register
  • 除了IEBRST外,其他bit在Bus Reset後都會被清除,所以在bus reset後一定要重新設定。
Interrupt Configure Register
  • 除了interrupt level , polarity 在bus reset後依然維持不變外,其他bit都會被set。一般要設成0x54,所以Bus Reset後應該要重新設定過。
Endpoint -
  • Endpoint 在Bus Reset後會reset,所以所有Endpoint設定都要重新設定一次。
還有一個很重要的就是在進入真正處理 interrupt 的code之前,要先將ISP1582的 interrupt enable disable,等到所有狀態都處理完後,要退出interrupt 之前,再打開。
=>否則不會再進入中斷..很奇怪。
也就是說 interrupt handler的code 大概是..
void __irq EInt_Usb(void)
{
ModeReg &= ~bGLINTENA;

... //handle int event here
...
...
Ack_EInt( );

ModeReg |= bGLINRENA;
}

其他奇怪的現象:
  • 有時候發生interrupt,讀取 interrupt register卻發現是0x00 (沒有中斷原因)。
  • BRST (Bus Reset) handler沒寫好(完全),使用multi-ice test run。一次可以發生HS_STATE interrupt,一次不行。
  • 使用ICE在BRST處設break point,可以正常產生 HS_STATE 中斷,將BRST的斷點移除,HS_STATE就不會發生。 ==> 這是因為interrupt handler沒有作UNLOCK,或是在BRST handler中沒有將 Mode Register的 CLKAON 重新set 。
    或是因為在ICE中 EP0SETUP 發生後,沒有繼續run 下去,完成interrupt 的後續動作,可能是因為 ISP1582 hardware reset 不完全所以re-run沒有辦法再進入中斷,要下一次才行。

Section Region$Table cannot be assigned to non-root region

google會找到 arm ads link

大意是說Region$Table 一定要放在和boot region 所在區域中,否則initial code沒辦法access到。
如果一定要將 C library code, 和其他code方開放。
loading script就要這樣寫:
ROM_LOAD 0x0
{
ROM_EXEC 0x0
{
vectors.o (Vect, +First)
__main.o (+RO)
* (Region$$Table)
* (ZISection$$Table)
}
RAM_EXEC 0x100000
{
*.o (+RO,+RW,+ZI)
}
}
也就是明確標出 Region$$Table, 和 ZISection$$Table 所在區域。
實際上 只有 Region$$Table, ZI$$Table 需要在 Root region。
__main.o 可以在其他地方。

如果不再同一個region,link時會自動在root region 加上一個挑版,ldr pc, ="real __main address",不會直接跳過去。

?? 這一篇好像比較接近 這個問題的說明...

scatter loading script - debug/release

ARM Chip 在embedded system developememt中最麻煩的部份就是reset vetor。
因為reset vector 和其他的vector 在一起。

對一般cpu,boot 區一定要是ROM,也就是說,要有code。對ARM來說.. vector table在ROM里。
也就代表vector table是不能修改的,這樣不能符合設計需求。

所以每一家ARM chip vendor都會有自己的一套"抽換 boot 區"的方法。
以前,比較古老的時候,好像都是用"remap",也就是說,boot 區有一段區域,可以由program 決定address ROM 或是 RAM。
當時,coding startup code就要作"remap":將 源boot ROM vector table (region) copy到RAM中,然後enable remap,讓起始區域改為addressing RAM chip。

有些其他的chiop vendor就不用remap,改用hardware loader 。
chip 內涵一塊SRAM,剛好是在起始位址區,然後hardware loader在chip boot時會自動將external ROM, FLASH的一個區塊copy進SRAM中,再由0x00開始值行。

S3C2440 用的是第二種,而且內部的SRAM只有4k。

4k中要做好的事:
  • 將chip configure 好
  • 將DRAM configur 好
  • 如果storage 是non-linear : 如NANDFLASH,或是壓縮過,就要將storage 中的program image解開到DRAM中
  • jmp to __main ( )
如果是要在 ice 中作load and run,就和實際boot and run 不一樣:
  • ice 中,dram 已經initialize OK。
  • ice 中,program image 已經load好。並且是在DRAM中。
所以ice load and run 就不需要作4k 中的好多事 (當然,有些重作一次也ok)。

但是也有麻煩的地方,像reset vector region。
實際 boot時,reset vector region 是由hardware loader 負責。所以起始address是0x00。
ice load and run時,reset vector 要由program (bootstrap : __main( ) )負責,而且,起始是在DRAM 中 (不是internal ram)。

所以release和 ice (debug) 必須要有不同的loading script。

以使用NAND Flash為例:
在releaes 版,要準備一塊region,4k region,locate在0x00中。
program image在NAND FLASH中,因為NAND Flash 不是linear accessible,要寫code作load,所以program address 不重要。可以跟4k region 在相同的位址:
FLASH 0x0000
{
_4kreg 0x0
{
vectors.o (Vect, +First)
囉唆這麼多..
直接寫出scatter loading script . for debug (ice load and run).
entry point in DRAM,image in DRAM。 copy vector by __main :
FLASH 0x33800000
{
DRAM 0x33800000
{
init.o (Init, +First)
* (+RO, +RW, +ZI)
}

HEAP +0 UNINIT
{
heap.o (+ZI)
}

STACKS +0x100000 UNINIT
{
stack.o (+ZI)
}

INT_SRAM 0x00
{
vector.o (Vect, +First)
}
}
Start Address = 0x33800000
這樣 c bootstrap library __main( )就會把 vector.o copy到0x00 的地方。

這是用在ADS。

CVS cannot pass through Proxy

想去拿familiar 的kernel 來build,follow 這一篇 : http://www.handhelds.org/moin/moin.cgi/Linux26ToolsAndSources

但是這裡有用proxy 作firewall,結果,當然是cvs login timeout.

Google一下...竟然,cvs 沒有辦法經過proxy !!
一般的解決方法是 用ssh,但是要要有account,不能用anonymouse。
不然就要用 CVS的http 介面的cvsgrab,但是要裝 j2sdk。

雖然如此,還是不敢相信,cvs 竟然不支援http_proxy.

1.26.2007

Synchronize with Driver loading/Unloading

Driver間的互相同步(通知?),是用 MessageQueue。

每一個driver,由device manager 管理(load)的driver,可以宣告一個自己的GUID。
然後Device Manager 在loading/unloading 這個driver時,會AdvertiseInterface( )。

需要知道這些動作的其他driver,ap,可以create 一個message queue,請device manager在AdvertiseInterface時將對應的message放到queue中 。

這樣需要被通知的driver, ap就可以利用這個message queue來得知該driver load/unload的狀態(時機)

msgQ = CreateMessasgeQueue( ).
RequestDeviceNotification( GUID_XXX, msgQ,,,)
WaitSingleEvent(msgQ...)
ReadMessageQueue(msgQ, buf....)
buf->....
記得在不需要通知時,要StopDeviceNotification。和 CloseMsgQueue。

以上各function 在 PlatformBuilder help 中都可以找到...

USB Mass Storage MDD.PDD

Pdd 收到SETUP0 -- 通知(Notify) Mdd。

Mdd 負責 Usb 2.0 的enumeration 動作。

Mdd 進入 " Configured "狀態 -- 通知 BOT

BOT 呼叫 STORE_Init( )。
  • STORE_Init 讀取registry ,轉換成內部變數。
BOT接著呼叫 BOT_OpenInterface( )。
很奇怪的是,static variable declairation 竟然宣告在c header ..
  • OpenInterface( ) 開啟兩個 Bulk Endpoint (In.Out)
接下來就是BOT的執行BOT (Bulk Only Transfer)的state..
ref: Usb Mass Storage Class, Bulk-Only Transfer
利用in. out兩個endpoint完成device 與host的溝通。

通訊的 data parsing 是用每次傳送的size 決定。
依序是:
  1. Command (CBW - Host to Device)
  2. In/Out (Data In/Out)
  3. Status (CSW - Device to Host)
Device 收到packet後,先由size, signature, checksum 確認該packet使否為 CBW。
接著執行CBW內容。
BOT_HandleCBW( )內部就是state machine,分成
  1. COMMAND TRANSFER
  2. DATA IN TRANSFER
  3. DATA OUT TRANSFER
  4. STATUS TRANSFER
這個state machine由BOT_TransferThread 呼叫。

BOT_TransferThread, 這個Thread的calling graph..

Init --
BOT_InternalInit=CreateThread --
BOT_TransferThread --
ProcessBIPipeTransfer/ProcessBOPipeTransfer --
BOT_HandleCBW --
BOT_ExecuteCB --
STORE_ExecuteCommand --

1.25.2007

some SCSI2 Cmds for Mass Storage

CE中 usb , mass storage function 各層 driver(source code) 的關係和負責的部份:

PDD(Chip Dependent) -- MDD(USB) -- BOT(CBW:Transport) -- STORE (SCSI:Storage)


SCSI Command 0x00, 0x25,0x23
ref : Wiki - SCSI Command

0x00 : TEST UNIT READY
0x03 : REQUEST SENSE
0x23 : READ FORMAT CAPACITY
0x25 : READ CAPACITY
0x28 : MEDIA CHANGED

REQUEST SENSE 是host用來取出某次command error 的 error code的command。
例如SD CARD移出,0x00 command 就會Fail,host就會送出0x03 向device (SD Card reader)取回剛剛fail 的原因。

完整的SCSI2 Spef 可以在這裡download

1.24.2007

Find All Partitions in Disk/Storage

STROE_INIT:
從registry 中讀取 "Partitions",非'0'才 mount partition : call MountSinglePartition( )。

Partitions 代表有多少partition。 在MountSinglePartition( )中會找到"這麼多"partition (而不是找全部")。

這一篇可以知道..partition table 是一個16 byte的結構:
{
BYTE BootInd; // index
BYTE FirstHead; // starting head
BYTE FirstSector; // starting sector
BYTE FirstTrack; // starting track
BYTE FileSystem; // Partition type
BYTE LastHead; // ending head based
BYTE LastSector; // ending sector based
BYTE LastTrack; // ending track based
DWORD StartSector; // Physical starting sector based
DWORD TotalSectors; // Total physical sectors in partition
}
以下都是在platformbuilder的"Help"中找到的(當然msdn裡也有),開啟help,輸入keyword馬上就可以找到,所以就不附link了。

在CE中,可以用" FindFirstPartition "來找到某個storage中的partition data。
HANDLE WINAPI FindFirstPartition(
HANDLE hStore,
PPARTINFO pPartInfo
);
hStotr : 就是用 OpenStore( )取得的某個storage的handle。
pPartition : 找到的會,會把partition table data 填入這個structure 中,所以是傳回值。

return 值 HANDLE 是一個很奇怪的handle,代表這一次"find"。
這個handle 的用法像 iterator 一樣。可以用"FindNextPartition"來找到下一個partition table
BOOL WINAPI FindNextPartition(
HANDLE hSearch,
PPARTINFO pPartInfo
);
第一個argument就是剛剛return 的handle。找到的下一個partition table會放在第二個argument中。return 值是boolean,也就是代表有沒有找到。

可以一直用FindNextPartition( )找出Storage中所有的 partition,直到return false 為止。
然後,就要把這個奇怪的handle close起來:
BOOL WINAPI FindClosePartition(
HANDLE hSearch
);
.一系列的function,最最開頭是OpenStore:
HANDLE OpenStore(
LPCSTR szDeviceName
);
那個string 就是storage的path ... 不知道ce的storage path是在哪裡,是不是像linux一樣是在 /dev/hda,sda..

Storage 的整個information,像...bytes per sector, cylinders, heads, total sectors,是要用DeviceIoControl( )取得。用CONTROL CODE: IOCTL_DISK_GETINFO。

driver : Init, Start, PowerUp/Down

PddInit
PddStart

並沒有PddPowerUp喔。
按下power key後..

PddPowerDown

再按下power key..

PddPowerUp

SetInterruptEvent

SetInterruptEvent 是由人工產生interrupt的方法。
上一篇的說明可以知道ce的中斷的方式。
driver 呼叫Kernel IO Control,將hardware interrupt id 轉為 dwSysIntr - 一個 handle,
之後 driver 都用這個 handle來操作(enable, disable...)這個interrupt。

SetInterruptEvent 就是採用人工方式發出中斷,argument就是 dwSysIntr。

但是這個function 僅限在 driver 的power on/off function 中使用,因為 driver power on/off funciton 執行時,是signel thread, nonpreemptive。(所以才可以call ? )

... 看完CE help 的說明,還是不瞭解....

1.23.2007

linux 過ISA proxy - NTLM

moto 看到的..
以往公司用ISA Server,所以linux都過不去...
407 Proxy Authentication Required ( The ISA Server requires authorization to fulfill the request. Access to Web Proxy filter is denied. ) 
現在只要裝ntlmaps就可以囉..
裝 ntlmaps
#sudo apt-get install ntlmaps

然後修改 /etc/ntlmaps/server.cfg
去設定Port(預設是5865)、帳號、密碼、網域、User Agent

設好之後重新啟動
#sudo /etc/init.d/ntlmaps restart

接著
export http_proxy=http://localhost:5865
..以上都是copy 自 moto 的說明。

順便看一下ntlmaps..
NTLM Authorization Proxy Server
是一個可以讓使用NTLM protocol 通過 proxy server 的軟體。
本身就是以proxy server的方式存在。

這個..我沒試過,因為這個公司不用ISA Proxy :)

1.20.2007

Libgloss

libgloss 負責一些startup code,I/O support。

以下來自於 http://sca.uwaterloo.ca/coldfire/gcc-doc/docs/porting_1.html#SEC1

這個library 來自於newlib,以往,這些部份包含在newlib source中,在newlib只需要支援一種target時,還OK。但是若是要支援很多target,這樣都混一起的方法就會變得很麻煩。

以往 newlib中 和target 相關的source code都放在一個叫"stub"的目錄,最早的時候,這個目錄中有些target的source code都是一個空殼,只是一個return,主要目的是讓 linker 能成功找到需要的function。

漸漸的,newlib支援的target越來越多,stub 目錄下的source code越來越齊全,library 中和hardware (targt)相關的function 都被分離出來放在stub 下。

後來有些計畫(gdb, glibc)發現他們也可以用這個stub 目錄的東西,所以就把stub 目錄從newlib source code中移出,獨立出來。 這樣有很多需要使用stub 目錄的計畫 就不需要把整個newlib 都拉進去。

就這樣stub 被獨立出來,稱作 Libgloss : Gnu Low-level OS support。

1.19.2007

FM1182 - Power Down

FM1182 是一顆Echo Cancellation DSP。
其中有一個 Power_Down pin,用來讓chip 進入 Power down mode,這樣比較省電。
但是奇怪的是.. 在Power Down Mode,這顆DSP還是有單向有動作,導致一方可以聽到,另一方聽不到。-- 所以 Power down 不是全部power down 只有部份power down而已。

Fortemedia - echo cancelation

富迪音訊 http://www.fortemedia.com

FAE : Danny Lan , 藍先生。

dannylan@fortemedia.com

TEL : 02 2546-2100 ext 26

Echo Cancellation Chip

0986190889

1.17.2007

OpenMoko - from LJ

本期LJ 有介紹上次說過的OpenMoko。
看沒有接下來的消息,網站上也沒有進一步的資料,我還以為真的像J說的,只是為了話題性..
LJ講的,比較新的有..

一家新的公司,Taiwan的公司: Funambol。

請大家不要在規格上挑他的毛病(no wifi, no gps...),這當然不是一個很Fancy的產品,但絕對是個劃時代的產品,他是史上
  1. 第一個將擁有 $300 Billion 的市場,又完全open source (完全使用open source)的。
  2. 第一個有open source community member加入設計的 。
  3. 盡力提供software developement document (from driver to UI)給所有人的。
  4. 完全open 所使用的linux source,並且使用package feed 作安裝方式的。
  5. 使用X11,讓user能使用(儘可能的)現有X11 應用程式的。
...的Mobile Phone。

就Open Source commmunity 來看,這是你絕對想要加入(購買)的產品。

以上

所以? 大家等著來寫自己的mobile phone application 吧... :P
續..

google了一下Funambol...還真是不錯,連Wiki都有(2006/2)。
這一篇有中文說明,quote一些:
Funambol 軟體將使基於 OpenMoko 的電話能夠與移動應用程式和內容實現無線同步--首先是個人資訊管理(聯系人、日曆等)和隨身手機電郵,其次是照片、視頻、鈴音、音樂以及更多內容的同步。

Funambol 基於開放標準 SyncML,並提供了一個無論是在作業系統還是在開發環境中都能提供移動應用程式和數據的平台。

FIC 移動通信業務部門 OpenMoko 創始人兼產品經理 Sean Moss-Pultz 表示:“移動系統將首次像個人電腦一樣開放,移動應用軟體也將同樣變得多樣化和更容易使用到。鈴音市場已經是一個價值為數十億美元的市場。我們相信,開放平台上的移動應用軟體下載量將會變得更大。”
嗯,想像也真不錯,否則下載鈴聲還要選手機型號還真是有點....XO。

Sleep in Thread

在CE下create一個thread,while(1) loop type。要加上Sleep(?msec),否則會干擾系統的peformance。
尤其是以default priority 執行的thread。

1.16.2007

Enumeration Data logs on CE. - Mass Storage

收到
80.06.00.01.00.00.40.00
是Get Descriptor - Device Descriptor.
送出
12.01.00.02.00.00.00.40.5E.04.FF.FF.00.00.01.02.00.01
是Device Descriptor

收到
00.05.02.00.00.00.00.00
是SET Address

收到
80.06.00.01.00.00.12.00
是Get Descripto - Device Descriptor,可以看到,這次的request Length是正確的(就是上次送出的Device Descriptor 的Length)。
送出
12.01.00.02.00.00.00.40.5E.04.FF.FF.00.00.01.02.00.01
是跟剛剛一樣的Device Descriptor。

收到
80.06.00.02.00.00.09.00
Get Descriptor - Configuration, Request 09 Bytes。
送出
09.02.20.00.01.01.00.C0.09
Configuration Descriptor。

收到
80.06.00.02.00.00.FF.00
Get Descriptor - Configuration - Request 256 Bytes。
送出
09.02.20.00.01.01.00.C0.00.
09.04.00.00.02.08.06.50.00.
07.05.81.02.00.02.00.
07.05.02.02.00.02.00
是Configuration,Interface,Endpoint x 2 Descriptor。

收到
80.06.00.03.00.00.FF.00
Get Descriptor - String ID。
送出
04.03.09.04
String Descriptor。

收到
80.06.02.03.09.04.FF.00
Get Descriptor - String, Index 2..... Product String
送出
7C.03.47.00.65.00.6E.00.......共64 bytes
應該是Long String。
送出...0x3C bytes的long String。

收到
80.06.00.03.00.00.FF.00
Get Descriptor - String ID。
送出
04.03.09.04
String Descriptor。


收到
80.06.02.03.09.04.FF.00
Get Descriptor -String, Index 2... Product String
送出
跟剛剛一樣的..0x40,然後是0x3C兩串long String

收到
80.06.00.01.00.00.12.00
Get Descriptor - Device (again ? x 2)
送出
12.01.00.02.00.00.00.40.5E.04.FF.FF.00.00.01.02.00.01
一樣的Device Descriptor,送出。
收到
80.06.00.02.00.00.09.00
Get Descriptor - Configuration, Request 9 bytes。
送出
09.02.20.00.01.01.00.C0.09
送出一樣的Configuration Descriptor。


收到
80.06.00.02.00.00.20.00
Get Descriptor - Configuration, Request 0x20 bytes (正確的長度Configuration + Interface + Endpoint x 2)。
送出
09.02.20.00.01.01.00.C0.00.
90.04.00.00.02.08.06.50.00.
07.05.81.02.00.02.00.
07.05.02.02.00.02.00
一樣的Configuration + Interface + Endpoint x 2。


收到
00.09.01.00.00.00.00.00
Set Configuration...度過重複的Get Descriptor ...Process...

1.14.2007

好看的時光旅行小說..

很平實的時間旅行小說。

包含很多的東西,太多了,所以沒辦法寫出來,寫了一個就想到還有下一個,然後擔心沒寫出來的部份。

簡單的故事內容正如故事大綱所說 (因為故事大綱也是有著作權的,所以沒辦法copy 過來)。

故事內容很有趣,從頭到尾都不枯燥,甚至可以說是歷史小說,推理小說(密室?),科幻小說(時間旅行)。

重考生主角被時光旅行者帶到歷史轉捩點度過8天。

平實得很好看,比起來,其他時光旅行的小說都顯得膚淺了些.. (或許我看的不夠多吧)。

我說的是哪一本呢?

1.12.2007

more on ISP1582

Datasheet上沒說的...
  • INT pin 腳如果一直是Low,chip 的interrupt 無法動作,導致InterruptConfigure Register 無法初始話 (reset value 變成0,而不是 datasheet 所說的0xFC)。同時也無法寫入。
  • Scratch Register 的寫入需要一些時間才會update。所以write後馬上read會不成功(尚未update)。
  • 雖然chip id 和scratch read/write 都OK了,其他register 還是有可能access error ,最"有名"的案例是Data register,每次讀出都是同一個value。好像不會作auto increatement。
    --這樣就要修改access time。

1.10.2007

應該會是個里程碑 - iPhone 發表

Apple的iPhone真的出了。
果然和大家猜想的一樣不可思議(沒有一項遺漏的)。

更不可思議的是,採用OS X (雖然先前的眾多小道消息也有提及這一點)。
所以一個well-design 的kernel 真的能讓porting 變得方便(G5-x86-? iPhone應該不是x86吧)。
並且能滿足極大與極小的兩個target - (Server and Phone)。

詳細的介紹在Engaged Chinese.. 這個,應該大家都知道了吧 :)

1.09.2007

some behavior on ISP1582

確認 D+ 有contact signal - 利用沒拿掉的 D+GPIO 控制 D+ High, Low,可以讓PC發出"無法偵測的USB裝置"。

將 D+ GPIO 設定floating,控制softcontact pin,可以讓PC發出"無法偵測的USB裝置"。

確認收到 busreset, HighSpeed_State 中斷。和一次VBUS狀態中斷。
-- 但是沒有收到EP0SETUP。

移除 D+,D-上所有的parts (電容,電阻,choke, esd.)和GPIO 控制D+的電阻。
--只有收到一次VBUS狀態中斷。set softcontact也無法讓pc產生"偵測不到的usb 裝置"。

從一插入pc 就有"無法偵測的usb 裝置",看來,在插入時D+應該會有High 信號。
--剛開始D+有電阻負載時,還OK。移除電阻負載就沒有動作了,猜測D+在供電(usb 插入)後應該是high state。

R 說要 check 一下hardware signal。因為code在上一個version board已經確認OK。
重點:
  • crystall freq : 12MHz
  • VBUS sense
C.J 也說先check 一下VBUS status bit 的狀態是否OK。還要確認一下VOUT 1.8V部份是否OK(1.8V)。好確認chip是否工作正常。

miniusb socket pin definition:
face connector. Left to Right
  1. VBUS : 5V
  2. D-
  3. D+
  4. GND
  5. 不知道
查在外部供電的設計下,不接USB (PC),D+有2V的電壓。

VBUS沒電的情況下,D+, D- 都是2V。

一旦供電,即使未reset,D+,D- 都是0 volt。

1.05.2007

OLPC - Mesh Network

OLPC 的 Mesh Network :
  • 802.11s at L2, in firmware
  • AODV
  • OLSR
另外需要 "mesh portals"
  • ARM base debian server w/disk & 256M RAM
  • Link to internet
  • Active antenna w/long range cabless
  • each portals may serve 3k clients
因為提到 portals - serv 3k clients 這一點,就有點疑問,是不是OLPC 本身還是 802.11b, 只有portal 才是 mesh ?
也就是mesh 是為了降低網路骨幹的建設成本。但是各client 還是用infra-tructure。

olpc wiki上寫: " Child-child sharing! OLPC Laptops are full-time wireless routers."

看來olpc"們"就可以建立一個mesh network.

下面這一段更cool..

The Marvell wireless chip can forward packets in the mesh network, with the CPU suspended, and the CPU may resume if explicitly addressed. Since the mesh network is so important, we want laptops to be able to participate in the mesh to keep forwarding packets when need be as efficiently as possible, and by suspending the processor we can increase the running time of the wireless a factor of 3-4. If this were not possible, children might need to disable wireless to preserve battery charge; by doing so, the mesh would be much less effective.

所以wireless chip 本身就可以作forwarding (routing ?)。 cpu 不用啟動。

所以一台olpc + solar power 放在半路上就可以當作mesh network 的接續點。



802.11s


定義Wireless Mesh 網路標準。

Wireless Mesh 網路系統中,每一個 node 都要有routing 的能力。所以所有的node 都可以直接與其他node 溝通 (電波範圍內的)。
這樣,就有點像 internet packet routing 一樣,mesh 內的封包,藉由一個一個node 接力的方式傳送到另一端。

所以mesh 中的node 要有與其他node交換routing table 的能力 (就想像是一個router 的動作)。


AODV


Ad-hoc On-demand Distance Vector

是一個找到routing path 的協定,當需要送出packet時,先broadcast 目的地request。其他收到這個 request message的node,先把message 的source 紀錄下來,並且forward 這個message (給誰?)。當有一個node 收到這個message 並且確認 自己有到達這目的地的能力,就送回 feedback message。 -- 因為每個forward的 node都已經紀錄有 各自的source node,就可以一路 send-back 回requester。

requster 收到 feedback 後,選出hops 最少的途徑,開始這個途徑送出資料。

其他沒有被選上的途經。在timeout後,剛剛紀錄下來的routing information 就會被清除掉。

AODV 的好處是一但建立routing path後,通訊的overhead很小。缺點就是 連線初始化的overhead很大。


OLSR


Optimize Link State Routing Protocol

每個Node 取得鄰近的一階(直接可達到),兩階(經過一個node可達到)的鄰近node routing 關係,這樣他就可以知道哪一個一階node可以和最多的鄰近 node 連線。 每個node都這樣找的話,就可以指到最佳routing path (?)

好處是routing path 是固定的,壞處是Node需要叫強的計算能力。

1.03.2007

ISP1582 - Endpoint 0

在 AN10046_5.pdf

Endpoint 0 是Control Endpoint。 不需要 initialize。
因為 Endpoint 0 的Type 是固定的- Control Type。
所以Chip 也設定好。

Endpoint 0 的 buffer size 也是固定的 :64 byte。


所以Endpoint 0 不用作 initialize 和 enable。


其他的Endpoint 都要initialize。而且為了正確規劃buffer,要follow 以下的程序來作:
  1. disable all endpoint IN and OUT
  2. 依序(從前到後,從IN到OUT)依序規劃 endpoint 的 MaxPacketSize。
  3. MaxPacketSize都設定完後,再從頭,依序設定每一個Endpoint (IN and OUT)的 Type。
  4. 依序Enable Endpoint
如果沒有這樣作,ISP 1582 internal RAM 會 " ill partitioned ",會造成 data corruption。

另外要注意DMA的endpoint register,不可以設定和 Endpoint Index register 一樣,否則會也會造成 data corruption。

所以當不使用DMA時,最好把DMA Endpoint Register 設定到不使用(enable)的endpoint上。
即使要用DMA時,也要小心 DMA endpoint register 和 endpoint index register 的值不能相同。
- 必要時,先移開其中一個register的值 -
另一個奇怪的地方

DataSheet 有關 ControlFunction Register 的 CLBUF 說明,是clear RX buffer of the indexed endpoint, TX buffer is not affected.

但是 AN10045,pdf : Clearing an IN buffer 又說要clear IN buffer (TX)。
在IN data stage 拔掉USB Cable會造成下一個stage (也就是重新enumeration )的error。
所以要 設定CLBUF (2次)。

以上是互相衝突的說明。

CreateThread & Priority

CE 有 0 - 255 個priority level,0最高。

這一頁
說明 CE 的Priority Level:

0 through 96 Reserved for real-time above drivers.
97 through 152 Used by the default Windows CE-based device drivers.
153 through 247 Reserved for real-time below drivers.
248 through 255 Maps to non-real-time priorities.
所以一般Device Driver 都社為100 (?)

CE要用 CeSetThreadPriority( )設定範圍才能有0 - 255。
用Win32標準的SetThreadPriority( )的話,範圍只有 8 個 (priority 最低的8個)。

CreateThread( null, 0, ThreadStartAddress, 給Thread的argument point, Create Suspend or Run, &ThreadId or Null)。

CreateThread( ) create出來的Priority會是 THREAD_PRIORITY_NORMAL (是多少?)。

有講到兩個限制:
  • 在Process Creating和 DLL initialization 中 create的 Thread要在 DLL Initialization 結束後才會被執行。
  • 每個Process ,每個DLL 只允許一個Thread 被create。
? Device Driver 算是 DLL ?
所以 Device Driver Create 的Process會在 Device Driver 的 xxx_init 結束後才會被執行? 而不是在呼叫CreateThread( )後 ?

ATM密碼新功能?

收到David 寄來的mail :
Subject: Fw: 被人挾持時可倒轉提款機密碼輸入!!!

被人挾持時可倒轉提款機密碼輸入如果你被匪徒挾持要求輸入提款機密碼 ,你可以用倒轉輸入密碼的方式去間接知會警方 ,例如你的密碼是 1234 的話 , 你可以輸入 4321, 提款機會識別到你是以倒轉方式輸入密碼 , 提款機會按你要求照出金額 , 但是會在匪徒不知情的情況下知會警方 , 這資料最近在電 視上公開 ,但是不常用因多數人並不知此方式存在 , 請儘可能轉給每一個人,謝謝你的幫忙。

這個...應該是假的吧,但是也告訴我們說... 密碼不要選對稱的號碼...

1.02.2007

壞掉了!

才買的X32,已經壞掉了,右邊HD的邊有裂縫,裂到正面。





當初就有聽說這一款X32很容易裂開,所以特別注意,想不到。還是裂了。
( IBM 換成 Lenova 果然就是不行 Q_Q ,品質一下從最好掉到最壞,跟以前的 570 比起來 差太多了!!! )

記得剛買時也沒寄保固卡什麼的....現在要去查一下了...
IBM 怎麼變得那麼差呀!

ibm 維修中心 電話

服務中心 電話
台北 (02) 2778-8997
新竹 (03) 571-0207
台中 (04) 2301-0627
高雄 (07) 236-0737
續...
如果不是自己送修,要打: 0800 000 700 - 個人電腦服務 -- 等很久 -- 筆記行電腦服務 -- 等很久 -- 就會有人來接聽了。

告知機型序號
姓名,地址(到時候 快遞來收的地址),電話。
描述一下壞掉的狀況。
會跟你約 來拿的時間。

快遞來拿的時候,只要 準備好NB+Battery 就可以。他們會準備盒子。
HD部份依照損壞狀況。他說如果不方便取出,可以留著,他會盡量小心不會弄壞。

要不要收費等工程師拿到東西後 會有報價單 打電話通知。讓你決定要不要修。

快遞部份是不需要收費的。

最後會告訴你 維修單號,可以到 這裡 查詢進度。

Some Links from msdn about USBFN PDD

USB Function Controller Driver Migration大概說明了一下CE提供的USB MDD..

CE 提供三種與hardware 無關的USB Client Drive : RNDIS,Serial,Storage。
source code在
\Public\Common\OAK\Drivers\USBFN\Class
這些Client使用的USB MDD source code在
\Public\Common\OAK\Drivers\USBFN\Controller\MDD
剩下就是自己要implement的PDD了。

稍微紀錄一下,這一篇 Configuring DMA Transfers between a Client Driver and a PDD 有說明USB PDD使用DMA的方式。

code reading..usbfn pdd, mdd.

混亂的Code Reading (& complain...)

使用SourceNavigator..要另外加入:
PUBLIC\COMMON\OAK\INC
PUBLIC\COMMON\OAK\DRIVERS\USBFN\CONTROLLER\MDD


呼叫最多次的就是IssueTransfer..
argument 有:
  • pointer to pddContext
  • Endpoint index
  • pointer to Transfer
controller的endpinter index register 用一個bit 代表direction,所以不能直接使用software 和usb spec上的endpoint index,要適當的轉換成 register 用的index。

structure : Transfer 內的dwFlag是 transfer direction ? 另外有pddContext 中,每一個Endpoint有property : Dir,也是代表direction ..

InitEndpoint

argument 雖然很多,但是有用到的只有
  • pointer to pddContext
  • Endpoint index
  • pointer to Endpoint Descriptor
設定內部Endpoint data structure 的Dir(ection)。
設定MAX_PACKETSIZE。
呼叫ConfigEndpoint( )
查configuEndpoint只有這裡使用,why implement this funciton in another object ?
整個code也沒有模組化得很好呀。不像是為了模組化所以將hardware(?)相關的部份分離出去..
設計方式很"奇妙"(em...),表面上是要將 interface,hardware,chip register 區分得很好。
但是,使用上卻又...
例如:將chip register operation 宣告在hardware 的class中的private part。
但是因為hardware class是一個static class,所以所有funciton 都可以經由class name直接呼叫。
連private part的function 也不例外...
既然如此,register operation 部份就獨立就好了,和必要在hardware class 中 ?
除非.. register class有要用到hardware class的property ....

加入MDD進入trace的話,變得好複雜..

原來每個Endpoint在MDD中是用一個Pipe來implement。