2.6. ioctls CEC_ADAP_G_LOG_ADDRS 和 CEC_ADAP_S_LOG_ADDRS

2.6.1. 名稱

CEC_ADAP_G_LOG_ADDRS, CEC_ADAP_S_LOG_ADDRS - 獲取或設定邏輯地址

2.6.2. 概要

CEC_ADAP_G_LOG_ADDRS

int ioctl(int fd, CEC_ADAP_G_LOG_ADDRS, struct cec_log_addrs *argp)

CEC_ADAP_S_LOG_ADDRS

int ioctl(int fd, CEC_ADAP_S_LOG_ADDRS, struct cec_log_addrs *argp)

2.6.3. 引數

fd

open() 返回的檔案描述符。

argp

指向 struct cec_log_addrs 的指標。

2.6.4. 描述

要查詢當前的 CEC 邏輯地址,應用程式呼叫 ioctl CEC_ADAP_G_LOG_ADDRS,並傳遞一個指向 struct cec_log_addrs 的指標,驅動程式會將邏輯地址儲存在該結構體中。

要設定新的邏輯地址,應用程式填寫 struct cec_log_addrs,然後呼叫 ioctl CEC_ADAP_S_LOG_ADDRS,並傳遞一個指向該結構體的指標。 只有在設定了 CEC_CAP_LOG_ADDRS 時,ioctl CEC_ADAP_S_LOG_ADDRS 才可用(否則返回 ENOTTY 錯誤程式碼)。 只有當檔案描述符處於發起者模式時(參見 ioctls CEC_G_MODE 和 CEC_S_MODE),才能呼叫 ioctl CEC_ADAP_S_LOG_ADDRS,否則將返回 EBUSY 錯誤程式碼。

要清除現有的邏輯地址,請將 num_log_addrs 設定為 0。 在這種情況下,所有其他欄位都將被忽略。 介面卡將進入未配置狀態,並且 cec_versionvendor_idosd_name 欄位都將重置為其預設值(CEC 版本 2.0、無供應商 ID 和空 OSD 名稱)。

如果物理地址有效(參見 ioctl CEC_ADAP_S_PHYS_ADDR),則此 ioctl 將阻塞,直到所有請求的邏輯地址都被宣告。 如果檔案描述符處於非阻塞模式,則它不會等待宣告邏輯地址,而是直接返回 0。

當宣告或清除邏輯地址時,會發送 CEC_EVENT_STATE_CHANGE 事件。

嘗試在已定義邏輯地址型別時呼叫 ioctl CEC_ADAP_S_LOG_ADDRS 將返回錯誤 EBUSY

type cec_log_addrs
struct cec_log_addrs

__u8

log_addr[CEC_MAX_LOG_ADDRS]

已宣告的實際邏輯地址。 由驅動程式設定。 如果無法宣告任何邏輯地址,則將其設定為 CEC_LOG_ADDR_INVALID。 如果此介面卡未註冊,則將 log_addr[0] 設定為 0xf,並將所有其他地址設定為 CEC_LOG_ADDR_INVALID

__u16

log_addr_mask

此介面卡已宣告的所有邏輯地址的位掩碼。 如果此介面卡未註冊,則 log_addr_mask 設定位 15 並清除所有其他位。 如果此介面卡根本未配置,則 log_addr_mask 設定為 0。 由驅動程式設定。

__u8

cec_version

此介面卡應使用的 CEC 版本。 請參見 CEC 版本。 用於實現 CEC_MSG_CEC_VERSIONCEC_MSG_REPORT_FEATURES 訊息。 請注意,CEC 框架不允許使用 CEC_OP_CEC_VERSION_1_3A

__u8

num_log_addrs

要設定的邏輯地址數量。 必須 ≤ available_log_addrs,如 ioctl CEC_ADAP_G_CAPS 返回的。 此結構中的所有陣列僅填充到索引 available_log_addrs-1。 將忽略剩餘的陣列元素。 請注意,CEC 2.0 標準允許最多 2 個邏輯地址,但某些硬體支援更多。 CEC_MAX_LOG_ADDRS 為 4。 驅動程式將返回它可以宣告的實際邏輯地址數量,該數量可能小於請求的數量。 如果此欄位設定為 0,則 CEC 介面卡應清除所有宣告的邏輯地址,並且所有其他欄位都將被忽略。

__u32

vendor_id

供應商 ID 是一個 24 位數字,用於標識特定的供應商或實體。 基於此 ID,可以定義供應商特定的命令。 如果您不想要供應商 ID,請將其設定為 CEC_VENDOR_ID_NONE

__u32

flags

標誌。 請參見 struct cec_log_addrs 的標誌,以獲取可用標誌的列表。

char

osd_name[15]

螢幕顯示名稱,如 CEC_MSG_SET_OSD_NAME 訊息返回的。

__u8

primary_device_type[CEC_MAX_LOG_ADDRS]

每個邏輯地址的主要裝置型別。 有關可能的型別,請參見 CEC 主要裝置型別

__u8

log_addr_type[CEC_MAX_LOG_ADDRS]

邏輯地址型別。 有關可能的型別,請參見 CEC 邏輯地址型別。 驅動程式將使用它宣告的實際邏輯地址型別更新此型別(例如,它可能必須回退到 CEC_LOG_ADDR_TYPE_UNREGISTERED)。

__u8

all_device_types[CEC_MAX_LOG_ADDRS]

CEC 2.0 特定:所有裝置型別的位掩碼。 請參見 CEC 所有裝置型別標誌。 它用於 CEC 2.0 CEC_MSG_REPORT_FEATURES 訊息中。 對於 CEC 1.4,您可以將此欄位保留為 0,也可以根據 CEC 2.0 指南填寫它,以便為 CEC 框架提供有關裝置型別的更多資訊,即使該框架不會直接在 CEC 訊息中使用它也是如此。

__u8

features[CEC_MAX_LOG_ADDRS][12]

每個邏輯地址的特性。 它用於 CEC 2.0 CEC_MSG_REPORT_FEATURES 訊息中。 這 12 個位元組包括 RC 配置檔案和裝置特性。 對於 CEC 1.4,您可以將此欄位全部保留為 0,也可以根據 CEC 2.0 指南填寫它,以便為 CEC 框架提供有關裝置型別的更多資訊,即使該框架不會直接在 CEC 訊息中使用它也是如此。

struct cec_log_addrs 的標誌

CEC_LOG_ADDRS_FL_ALLOW_UNREG_FALLBACK

1

預設情況下,如果無法宣告所請求型別的任何邏輯地址,則它將返回到未配置狀態。 如果設定了此標誌,則它將回退到未註冊的邏輯地址。 請注意,如果明確請求了未註冊的邏輯地址,則此標誌不起作用。

CEC_LOG_ADDRS_FL_ALLOW_RC_PASSTHRU

2

預設情況下,CEC_MSG_USER_CONTROL_PRESSEDCEC_MSG_USER_CONTROL_RELEASED 訊息僅傳遞給跟隨者(如果有)。 如果設定了此標誌,則這些訊息也會傳遞到遠端控制輸入子系統,並且會顯示為擊鍵。 此特性需要顯式啟用。 如果使用 CEC 輸入密碼等,則可能不希望啟用此特性,以避免瑣碎的擊鍵偵聽。

CEC_LOG_ADDRS_FL_CDC_ONLY

4

如果設定了此標誌,則該裝置為 CDC-Only。 CDC-Only CEC 裝置是隻能處理 CDC 訊息的 CEC 裝置。

所有其他訊息都將被忽略。

CEC 版本

CEC_OP_CEC_VERSION_1_3A

4

根據 HDMI 1.3a 標準的 CEC 版本。

CEC_OP_CEC_VERSION_1_4B

5

根據 HDMI 1.4b 標準的 CEC 版本。

CEC_OP_CEC_VERSION_2_0

6

根據 HDMI 2.0 標準的 CEC 版本。

CEC 主要裝置型別

CEC_OP_PRIM_DEVTYPE_TV

0

用於電視。

CEC_OP_PRIM_DEVTYPE_RECORD

1

用於錄製裝置。

CEC_OP_PRIM_DEVTYPE_TUNER

3

用於帶有調諧器的裝置。

CEC_OP_PRIM_DEVTYPE_PLAYBACK

4

用於播放裝置。

CEC_OP_PRIM_DEVTYPE_AUDIOSYSTEM

5

用於音訊系統(例如,音訊/影片接收器)。

CEC_OP_PRIM_DEVTYPE_SWITCH

6

用於 CEC 交換機。

CEC_OP_PRIM_DEVTYPE_VIDEOPROC

7

用於影片處理器裝置。

CEC 邏輯地址型別

CEC_LOG_ADDR_TYPE_TV

0

用於電視。

CEC_LOG_ADDR_TYPE_RECORD

1

用於錄製裝置。

CEC_LOG_ADDR_TYPE_TUNER

2

用於調諧器裝置。

CEC_LOG_ADDR_TYPE_PLAYBACK

3

用於播放裝置。

CEC_LOG_ADDR_TYPE_AUDIOSYSTEM

4

用於音訊系統裝置。

CEC_LOG_ADDR_TYPE_SPECIFIC

5

用於第二臺電視或影片處理器裝置。

CEC_LOG_ADDR_TYPE_UNREGISTERED

6

如果您只想保持未註冊狀態,請使用此選項。 用於純 CEC 交換機或 CDC-only 裝置(CDC:能力發現和控制)。

CEC 所有裝置型別標誌

CEC_OP_ALL_DEVTYPE_TV

0x80

這支援電視型別。

CEC_OP_ALL_DEVTYPE_RECORD

0x40

這支援錄製型別。

CEC_OP_ALL_DEVTYPE_TUNER

0x20

這支援調諧器型別。

CEC_OP_ALL_DEVTYPE_PLAYBACK

0x10

這支援播放型別。

CEC_OP_ALL_DEVTYPE_AUDIOSYSTEM

0x08

這支援音訊系統型別。

CEC_OP_ALL_DEVTYPE_SWITCH

0x04

這支援 CEC 交換機或影片處理型別。

2.6.5. 返回值

成功時返回 0,出錯時返回 -1,並適當地設定 errno 變數。 通用錯誤程式碼在 通用錯誤程式碼 章節中描述。

ioctl CEC_ADAP_S_LOG_ADDRS 可以返回以下錯誤程式碼

ENOTTY

未設定 CEC_CAP_LOG_ADDRS 功能,因此不支援此 ioctl。

EBUSY

CEC 介面卡當前正在配置自身,或者已經配置並且 num_log_addrs 非零,或者另一個檔案控制代碼處於獨佔跟隨者或發起者模式,或者該檔案控制代碼處於模式 CEC_MODE_NO_INITIATOR

EINVAL

struct cec_log_addrs 的內容無效。