[轉載請註明出處] 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-arch

。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

lshal-ex.png

從系統可觀查到這個addon,並隨著移除usb而消失。

ps-addon.png

kezeodsnx 發表在 痞客邦 PIXNET 留言(0) 人氣()