[轉載請註明出處] http://kezeodsnx.pixnet.net/blog
作者: kezeodsnx
Refer to http://people.freedesktop.org/~david/hal-spec/hal-spec.html#spec-device-info
看spec就是這樣,先把英文看懂,單字查一查,奇怪的字串組合就整組貼上去google,看看有沒有什麼發現。再挑出有需要 (看的懂)的章節,反覆朗誦個幾次,看看有沒有感覺。沒有感覺,就只好期待有感覺的人衝第一炮了。基本上,能翻的出來,又不會讓自己看不懂,已有小成。
上兵伐謀,其次伐交,其次伐兵,其下攻城。攻個城先!
Target很重要,不管做什麼事都要知道自己在幹什麼,預期要達到什麼效果,才不會發散。
HAL的的target是什麼?
在Linux系統下,所有東西都用file來表示,包括所有的device。比如說,硬碟可以是/dev/hda,印表機可以是/dev/lp,這算是好理解的。如果是/dev/hidraw0,那這是什麼?我也不知道,隨便找的。如果是某種device,那driver是哪一支?對一個application來說,如何識別/操作這個device,有沒有對user更friendly的資訊可以提供?
結果,可能會發生一種情況: 寫AP的和寫driver的是兩票人,對系統來說,device裝好了,driver也掛上去了,但寫AP的人不知道怎麼使用/優化自己的AP方便user來操作整個系統。因此對一個device而言,如何有用而完整的描述在使用上來說非常重要。
這就是hal的target--讓想用device的人/事/物,能更方便/完整的使用該device。
因此,hal提供連接上系統device的相關資訊,包括metadata, 以及變動(add, remove)時的相關hook function (callout, addon)。
About
。device object:在hal中,將hardware以device object表示,並有其id及key/value之類的屬性。這些屬性可能是由hardware本身或是設定檔提供,,或是由fdi檔merger進來(fdi可以是系統本身提供,driver package提供或是user-defined)。系統可用這些屬性來區別、設定不同的device object.
。device object對系統而言,是一個可定址(addressable)的單位。這表示,physical device 和device object間存在1對多的關係--一個device對hal來說,可能是好幾個device object。例如,一台事務機,可以是printer device object或 scanner device object。相對的也存在多對一的關係,但user不需要知道這些細節,user只要可以用就好了。
。device object由下列資訊組成:
1. UDI: unique device identifier,對port/slot應是independent。
2. Properties: Key/Value的組合,可定義不同的type。
3. Interface: AP可使用D-BUS interface來設定或使用device。
Architecture
。HAL daemon: hal的中心,負責維護device object的database,從fdi檔取得屬性資訊,並管理整個device object的life cycle。也會使用helper function向device查詢其他資訊。
。Applications: 取用由hal提供的資訊
。Callouts: 當device object新增或移除時,由hal daemon所叫用,時間點在將event送往dbus之前。這對開發 AP的3rd party而言非常有用,可在dbus前merge更多的資訊 (如前述,有用而完整的描述相當重要,並可避免錯誤)。
。Methods: event可由不同的interface(volume interface, storage interface, power management interface, etc)傳送。而method可指定使用的interface,並設定lock,決定是否允許別的device object使用此interface。
。Addons: 以daemon型式存在,並隨著device object產生或消失。也可要求指定的interface以提供AP設定或使用device object。如此可避免使用method
。Device information files(.fdi): 用來比對屬性以整合device object相關資訊。包括指定使用哪個callout, method和addon。
例1,在/usr/share/hal/fdi/policy/10osvendor/20-storage-methods.fdi,指定hald-addon-storage為usb disk的callon,並polling其變化(新增/移除)。
例2,當<match key="/org/freedesktop/Hal/devices/computer:system.kernel.name" string="Linux"> passes,將mount options屬性merge。亦可在此修改特殊device的option
。FDI Search Path:
/usr/share/hal/fdi: package 可自行提供fdi
/etc/hal/fdi/: user (administrator)所指定的fdi
這兩個目錄是有順序性的,意即match到/etc/hal/fdi的相同key時,會overwrite掉/usr/shre/hal/fdi。
。目錄架構
Information: 提供device本身可merge的屬性
Policy: 提供policy property,比如使用哪個callout
preprobe: 在probe device之前,去match key
每個folder中,10osvendor是hal package提供,20thirdparty是3rd party提供
。Flow:
1. 發現device,測試preprobe下的fdi。通常的用法是設定info.ignore為true,讓hal by pass此裝置。這麼做的原因有很多,可能是硬體產生限制而使用的workaround,或是timing的問題,不一而足。也可在此叫用預設的程式,以完成在probe之前所需customise的動作。
2. hal叫用 prebrobe的callout。
3. hal probe device。
4. 測試所有information下的fdi,這個動作的目的是對該device object有更完整而有用的描述。
5. 測試所有policy下的fdi,設定device object相關的callout,addon或method。
6. hal執行callout,addon或method,並將此裝置資訊announce給dbus (例如,前述的mount options)
Example
插入usb,可透過lshal或是圖型化介面的gnome-devivce-manager 來觀查device object的描述。其中指定hald-addon-storage為其callon
從系統可觀查到這個addon,並隨著移除usb而消失。
留言列表