SoundWire子系統概述¶
SoundWire是由MIPI聯盟於2015年批准的一項新介面。 SoundWire用於傳輸通常與音訊功能相關的資料。SoundWire介面經過最佳化,可將音訊裝置整合到移動或移動啟發式系統中。
SoundWire是具有資料和時鐘線的2針多點介面。 它有助於開發低成本,高效,高效能的系統。 SoundWire介面的廣泛關鍵特性包括
透過單個兩針介面傳輸所有有效負載資料通道,控制資訊和設定命令。
透過使用DDR(雙倍資料速率)資料傳輸來降低時鐘頻率,從而降低功耗。
時鐘縮放和可選的多個數據通道可在資料速率方面提供廣泛的靈活性,以滿足系統要求。
裝置狀態監視,包括中斷式警報到Master。
SoundWire協議最多支援十一個Slave介面。 所有介面共享包含資料和時鐘線的公共匯流排。 每個Slave最多可以支援14個數據埠。 13個數據埠專用於音訊傳輸。 資料埠0專用於Bulk控制資訊的傳輸,每個音訊資料埠(1..14)可以在傳送或接收模式下最多支援8個通道(通常是固定方向,但規範允許配置方向)。 但是,頻寬限制約為19.2..24.576Mbits/s,不允許同時傳輸11*13*8個通道。
下圖顯示了SoundWire Master和兩個Slave裝置之間的連線示例。
+---------------+ +---------------+
| | Clock Signal | |
| Master |-------+-------------------------------| Slave |
| Interface | | Data Signal | Interface 1 |
| |-------|-------+-----------------------| |
+---------------+ | | +---------------+
| |
| |
| |
+--+-------+--+
| |
| Slave |
| Interface 2 |
| |
+-------------+
術語¶
MIPI SoundWire規範使用術語“device”來指代Master或Slave介面,這當然可能令人困惑。 在本概述和程式碼中,我們僅使用術語interface來指代硬體。 我們遵循Linux裝置模型,透過將連線到總線上的每個Slave介面對映為由特定驅動程式管理的裝置。 Linux SoundWire子系統提供了一個框架來實現SoundWire Slave驅動程式,該框架提供了一個API,允許第三方供應商啟用實現定義的功能,而常見的設定/配置任務由匯流排處理。
匯流排:實現SoundWire Linux匯流排,該匯流排處理SoundWire協議。 程式設計所有MIPI定義的Slave暫存器。 代表SoundWire Master。 系統中可能存在匯流排的多個例項。
Slave:註冊為SoundWire Slave裝置(Linux裝置)。 多個Slave裝置可以註冊到匯流排例項。
Slave驅動程式:控制Slave裝置的驅動程式。 MIPI指定的暫存器由匯流排直接控制(並透過Master驅動程式/介面傳輸)。 任何實現定義的Slave暫存器都由Slave驅動程式控制。 實際上,預計Slave驅動程式依賴於regmap,並且不請求直接暫存器訪問。
程式設計介面(SoundWire Master介面驅動程式)¶
SoundWire匯流排支援SoundWire Master實現和SoundWire Slave裝置的程式設計介面。 所有程式碼都使用SoC設計人員和第三方供應商常用的“sdw”字首。
每個SoundWire Master介面都需要註冊到匯流排。 匯流排實現API來讀取標準Master MIPI屬性,並且還提供Master ops中的回撥,供Master驅動程式實現其自己的功能以提供功能資訊。 此時尚未實現DT支援,但是由於可以使用device_property_ API啟用功能,因此新增DT支援應該很簡單。
Master介面以及Master介面功能基於板檔案,DT或ACPI進行註冊。
以下是註冊SoundWire匯流排的匯流排API
int sdw_bus_master_add(struct sdw_bus *bus,
struct device *parent,
struct fwnode_handle)
{
sdw_master_device_add(bus, parent, fwnode);
mutex_init(&bus->lock);
INIT_LIST_HEAD(&bus->slaves);
/* Check ACPI for Slave devices */
sdw_acpi_find_slaves(bus);
/* Check DT for Slave devices */
sdw_of_find_slaves(bus);
return 0;
}
這將為Master裝置初始化sdw_bus物件。 向匯流排提供“sdw_master_ops”和“sdw_master_port_ops”回撥函式。
匯流排使用“sdw_master_ops”以硬體特定的方式控制匯流排。 它包括匯流排控制功能,例如在總線上傳送SoundWire讀取/寫入訊息,設定時鐘頻率和流同步點(SSP)。 “sdw_master_ops”結構從匯流排中抽象出Master的硬體詳細資訊。
匯流排使用“sdw_master_port_ops”來設定Master介面埠的埠引數。 MIPI規範未定義Master介面埠暫存器對映,因此匯流排呼叫“sdw_master_port_ops”回撥函式來執行埠操作,例如“埠準備”,“埠傳輸引數設定”,“埠啟用和停用”。 然後,Master驅動程式的實現可以執行特定於硬體的配置。
程式設計介面(SoundWire Slave驅動程式)¶
MIPI規範要求每個Slave介面公開一個唯一的48位識別符號,該識別符號儲存在6個只讀dev_id暫存器中。 此dev_id識別符號包含供應商和部件資訊,以及一個欄位,用於區分相同的元件。 附加的類欄位當前未使用。 Slave驅動程式是為特定的供應商和部件識別符號編寫的,匯流排基於這兩個ID列舉Slave裝置。 Slave裝置和驅動程式的匹配是基於這兩個ID完成的。 匯流排在裝置和驅動程式ID成功匹配後呼叫Slave驅動程式的探測。 在Master和Slave裝置之間強制執行父/子關係(邏輯表示形式與物理連線對齊)。
有關Master/Slave依賴關係的資訊儲存在平臺數據,板檔案,ACPI或DT中。 MIPI軟體規範為具有多個Master介面的控制器定義了附加的link_id引數。 dev_id暫存器僅在連結範圍內是唯一的,link_id在控制器範圍內是唯一的。 dev_id和link_id在系統級別上不一定是唯一的,但是父/子資訊用於避免歧義。
static const struct sdw_device_id slave_id[] = {
SDW_SLAVE_ENTRY(0x025d, 0x700, 0),
{},
};
MODULE_DEVICE_TABLE(sdw, slave_id);
static struct sdw_driver slave_sdw_driver = {
.driver = {
.name = "slave_xxx",
.pm = &slave_runtime_pm,
},
.probe = slave_sdw_probe,
.remove = slave_sdw_remove,
.ops = &slave_slave_ops,
.id_table = slave_id,
};
對於功能,匯流排實現API來讀取標準Slave MIPI屬性,並且還提供Slave ops中的回撥,供Slave驅動程式實現自己的功能以提供功能資訊。 匯流排需要知道一組Slave功能來程式設計Slave暫存器並控制匯流排重新配置。
連結¶
SoundWire MIPI規範1.1可在以下網址獲得:https://members.mipi.org/wg/All-Members/document/70290
SoundWire MIPI DisCo(發現和配置)規範可在以下網址獲得:https://www.mipi.org/specifications/mipi-disco-soundwire
(透過註冊公開訪問,或者MIPI會員可以直接訪問)
MIPI聯盟製造商ID頁面:mid.mipi.org