3.25.2009

CE SDCARD Driver atchitecture

在 \PUBLIC\COMMON\OAK\DRIVERS\SDCARD



HostContainer -- 內部保有 一個 SDHost[] (以HostContainerClass 處理),
利用 InserSDHost( )加入到 Arrary中。

HostContainer 是一個Singleton pattern

SDHost 內有一個 *SDSlot[]
以上都在sdbus.cpp
SDSlot 內有一個 SDDevice[]


SDSlot[] 的array size是在 SDHost 生成時指定的 (dwNumSlot)。
但是 SDHost[] 是用 InserSDHost( ) 動態加入。

是在 HostContainer 的 static function : SDHCDAllocateContext_X( ) 中生成的,dwNumSlot 是 argument。

SDHCDAllocContext_X( )是由 另一個 driver : HSMMC 透過 function pointer 呼叫。
呼叫時,dwNumSlot 是從 registry key 讀出來的。 -- 是猜出來的。

Slot在處理 CardInsert 時,才會 生成 SDDevice,依照 inser card 的 function number 來決定生成多少 device.



SDHostContainer -- 內含 SDHost
SDHost -- 內含 SDSlot
SDSlot -- 內含 SDDevice

SDHostContainer 內含 function-pointer array, 指向 HSMMC
SDHostContainer 內含 static function array,expose (called by) HSMMC


SDSlot 和 SDDevice 可以送出 Command 給 SD, ( 因為他們都有繼承 SDBusRequest)
但是 SDSlot 只操作 SDRequestQueue,
SDDevice 實際生成 SDRequestQueue,然後呼叫
 m_sdSlot.QueueBusRequest(pNewRequest);
呼叫 slot 的 queue operation , 將 request 加入到 request queue 中



SDWorkItem 是一個 postevent, thread handle event 的 class。
如其名,是實際工作的 class,生成會後launch 一個 working thread,和一個event queue 。
可以藉由 PostEvent( ) 通知該 Thread。
可以視為獨立於 CE 系統之外的 event-signal 系統
但是很白痴的會call SlotStatusChangeProcessing( )。
所以要利用這個WorkItem機制,要繼承這個class,然後實做 SlotStatusChangeProcessing( )

沒有留言: