高通8255 Android Virtio Virtio-SPI 配置方法

目錄

一:VirtIO和Passthrough的區別

二:配置邏輯

三:配置方法

步驟一:QNX SPI資源配置 & 測試

配置

測試

步驟二:BE配置 &測試

配置

測試

步驟三:Hypervisor配置

配置

測試

步驟四:Android側配置

配置-config相關

組入config的方法

確認config的方法

配置-DTS相關

測試

參考網站

黑莓官方資料:

通信調試方法:


一:VirtIO和Passthrough的區別

二:配置邏輯

以上章節內容 可參照我的這篇文章,本質上是一樣的:

高通8255 Android Virtio Virtio-IIC 配置方法_virtio i2c-CSDN博客

三:配置方法

因為Virtio的邏輯是分 BE(后端) FE(前端),所以依然要先保證QNX配置成功,然后再調試Android側

步驟一:QNX SPI資源配置 & 測試

配置

正常配置一路QNX spi資源:

SD-QNX4.5.6.0/apps/qnx_ap/boards/core/dalconfig/lemans_rumi/config/spi_props_lemans.xml

SD-QNX4.5.6.0/apps/qnx_ap/boards/core/dalconfig/lemans_rumi/config/pin_config.c

測試

使用 QNX spidbgr 命令?進行測試

測試工具代碼路徑:/SD-QNX4.5.6.0/apps/qnx_ap/AMSS/platform/services/applications/spidbgr

使用方法參照:spidbgr.use%C :
Usage: spidbgr -m [master_node] -d [slave_id] -M [mode] -f [freqency] -w -l [master_wlen] -o [master_wmsg]  //write onlyspidbgr -s [slave_node] -d [slave_id] -M [mode] -f [freqency] -R -B [slave_rlen]  //read onlyspidbgr -m [master_node] -d [slave_id] -M [mode] -f [freqency] -w -l [master_wlen] -o [master_wmsg] -s [slave_node] -R -B [slave_rlen] //master write and slave readspidbgr -m [master_node] -d [slave_id] -M [mode] -f [freqency] -x -l [master_wlen] -o [master_wmsg] -s [slave_node] -X -L [slave_wlen] -O [slave_wmsg]  //exchange between master and slavecmd list:-m --master                      master portid (range is 1-12)-s --slave                    slave portid (range is 1-12)-d --device                      slaveid (default 0, range is 0-3)-G --setcfg                      set config-M --mode                             mode (default 0x2608)-f --freq                             freq (default 1000000HZ)-w --master_write                master write-W --slave_write               slave write-r --master_read                 master read-R --slave_read                slave read-x --master_xchange            master xchange-X --slave_xchange             slave xchange-c --master_cmdread            master cmdread-C --slave_cmdread             slave cmdread-i --master_cmdwrite           master cmdwrite-I --slave_cmdwrite            slave cmdwrite-g --get_info                  get info-l --master_wlen               master write msg len (default 0)-b --master_rlen               master read msg len (default 0)-L --slave_wlen                slave write msg len (default 0)-B --slave_rlen                slave read msg len (default 0)-o --master_wmsg                 master write message-O --slave_wmsg                  slave write message-v --verbose                     verbose (default disable)-t --timeout_value_set_sec     timeout value set sec(default 5s)-T --timeout_value_set_nsec    timeout value set nsec(default 0ns)-n --timeout_value_get         timeout value get-p --random_data_padding       random data padding-z --iteration_count           iteration_count(default 1)-h --help                        helpThe meaning of each bit of the mode parameter:
0-7   bit    the number of bits in a data frame
8     bit    CPOL, 0:SCLK is low when idle, 1:SCLK is high when idle
9     bit    CPHA, 0:input bit is shifted in first transition edge, 1:output bit is shifted in first transition edge
10    bit    spi bit order, 0:LSB first 1:MSB first
11    bit    spi cs polarity, 0:active low 1:active high
13    bit    cs mode, 0:CS is deasserted after transferring data for N clock cycles 1:CS is asserted as long as the core is in Run state
22-25 bit    inter-word delay(1-15 cycles)
30    bit    SW loopback enable, 0:disable 1:enableEg. Get SPI configurationspidbgr -m 2 -gThis will read back something like :device info, name-A2B SPI / Mercu:mode-0x00002608:clock-5000000Hzdriver info, name-QCOM SPI Master:version-1:feature--2147483648Eg. hw loopback between spi2 and spi9(spi2 write spi9 read)spidbgr -d 0 -M 0x2608 -f 2000000 -m 2 -w -l 2 -o 0x55 0xaa -s 9 -R -B 2Eg.  spi master write(spi_write)spidbgr -d 0 -M 0x2608 -f 2000000 -m 2 -w -l 2 -o 0x55 0xaaEg.  spi master read(spi_read)spidbgr -d 0 -M 0x2608 -f 2000000 -m 2 -r -b 2Eg.  spi master xchange(spi_xchange)spidbgr -d 0 -M 0x2608 -f 2000000 -m 2 -x -l 2 -o 0x55 0xaaEg.  spi master write and read(spi_cmdread)spidbgr -d 0 -M 0x2608 -f 2000000 -m 2 -c -l 2 -o 0x55 0xaa -b 2Eg. spi cmdwrite:spidbgr -d 0 -M 0x2608 -f 2000000 -m 2 -i -l 2 -o 0x55 0xaaNotes:- Port ID range is 1-12. Slave ID range is 0-3.- This debugger can handle at max 64K bytes per transaction.- It can use the random data padding mode through the -p flag, specify the wlen is enough, no need to manually input wmsg in the cmd, such as:spidbgr -m 2 -d 0 -M 0x40002608 -f 1000000 -x -l 500 -p- It can log the transfer info through the -v flag, such as:# spidbgr -m 2 -d 0 -M 0x40002608 -f 1000000 -x -l 10 -p -v=========spi transfer info=========iteration_times: 1master_portid: 2 slave_portid: 0cs_num: 0mode: 0x40002608freq: 1000000HZmaster_wlen: 10 master_rlen: 10slave_wlen: 0 slave_rlen: 0master_cmd: SPI_XCHANGEslave_cmd: Nonemaster_wmsg: 0x28 0xac 0x87 0xda 0x70 0x19 0x9d 0x8c 0xb1 0x1===================================- It can set the timeout value with the -t & -T flags, -t is sec, -T is nsec , such as:spidbgr -m 2 -d 0 -M 0x40002608 -f 100000 -x -l 2 -p  -t 10 -T 1000000- It can get the timeout value with the -n flag, such as:spidbgr -m 2 -d 0 -M 0x40002608 -f 100000 -x -l 2 -p  -t 10 -T 1000000 -n/dev/spi2 timeout_sec is 10s, timeout_nsec is 1000000ns- The iteration count can be specified with the -z flag, such asspidbgr -m 2 -d 0 -M 0x40002608 -f 100000 -x -l 2 -p  -z 5

測試示例:

spidbgr -d 0 -M 0x2608 -f 10000000 -m 3 -w -l 1 -o 0xaaspidbgr -d 0 -M 0x2608 -f 10000000 -m 3 -w -l 1 -o 0xaa

QNX 測試 結果 OK?

步驟二:BE配置 &測試

配置

Virtio機制是BE以.so形式進行加載運行,所以要求確保上述使用的文件生成so并再車機中運行。

因此在此文件中追加相關內容,將so推送到機器中

SD-QNX4.5.6.0/apps/qnx_ap/target/hypervisor/host/build_files/system.build.tmpl

測試

確認 /mnt/lib64/dll 中存在此

測試結果:ok

步驟三:Hypervisor配置

配置

/SD-QNX4.5.6.0/apps/qnx_ap/target/filesets/secpol/gvm_la.txt

/SD-QNX4.5.6.0/apps/qnx_ap/target/hypervisor/gvm/ivi/lemans/la/linux-la.config

 #virtio-SPI Tunervdev vdev-virtio-spi.so loc 0x1cd12000 intr gic:111 verbose 3 device spi1 cs_num 4

上述代碼簡要描述

  1. vdev vdev-virtio-spi.so ? 步驟二中提到的 .so,用于將此so提供給Android側使用

  2. loc 0x1cd12000 intr gic:111 ? 給Android側虛擬的一段地址和中斷號,這兩個參數隨意編寫即可,但不要和其他資源地址和中斷號發生重復和覆蓋,同時要和后續步驟四中DTS描述匹配

  3. verbose 3:設置日志輸出級別為3(較詳細的調試信息,可以不必過多關注)

  4. device spi1:指定關聯的QNX配置的 SPI設備為spi1,因為上述qnx配置的是/dev/spi1 所以這里要配置spi1?

  5. cs_num 4:設置芯片選擇(CS)信號 固定配置不用關心

測試


對于hypervisor參照QNX log即可,如果QNX和Android側配置都OK后,QNX啟動時沒有提示異常log ,暫且認為此處配置正常。(基于高通的base代碼,hypervisor需要修改的配置并不多,所以如果配置出現明顯錯誤,例如上述提到的地址或者資源不正確,會有相關明顯報錯信息)?測試結果: 無異常log ?OK

步驟四:Android側配置

配置-config相關

首先保證Android側 IIC可用,前提是 Android kernel的三個config需要打開,需要配置為 y或者m

CONFIG_SPI_MSM_GENI=m
CONFIG_SPI_SPIDEV=m
CONFIG_VIRTIO_SPI=m

組入config的方法

修改/SD-HQX4.5.6.0/lagvm/LINUX/android/kernel_platform/msm-kernel/arch/arm64/configs/vendor/autogvm_GKI.config

在 高通流程中,defconfig位于 ? /SD-HQX4.5.6.0/lagvm/LINUX/android/kernel_platform/msm-kernel/arch/arm64/configs/gki_defconfig

從Android編譯相關log可以看到,高通處理過程中會將上述autogvm_GKI.config merge 到 ?gki_defconfig中,所以不建議直接更新gki_defconfig。

log如下:

Using msm-kernel/arch/arm64/configs/gki_defconfig as baseMerging msm-kernel/arch/arm64/configs/vendor/autogvm_GKI.config

確認config的方法

在build out文件中確認當前config值build out文件路徑:/SD-HQX4.5.6.0/lagvm/LINUX/android/out/target/product/gen4_gvm/obj/DLKM_OBJ/kernel_platform/msm-kernel/.config

確認結果? OK

上述config 我是以模塊形式進行的加載(m),所以還需要更新文件? ?/SD-HQX4.5.6.0/lagvm/LINUX/android/kernel_platform/msm-kernel/autogvm.bzl 使得啟動時,自動加載相關 .ko文件?

這幾個.ko文件路徑參照相關driver編譯路徑和makefile即可

例如 ?/SD-HQX4.5.6.0/lagvm/LINUX/android/kernel_platform/msm-kernel/drivers/spi/Makefile 中

obj-$(CONFIG_SPI_SPIDEV) += spidev.o所以路徑為 drivers/spi/spidev.ko

配置-DTS相關

按照正常DTSI配置 SPI節點即可

/SD-HQX4.5.6.0/apps_kernel/kernel_platform/qcom/proprietary/devicetree/qcom/lemans-vm-la.dtsi ? ?

? ? ? ? aliases {

? ? ? ? ? ? ? ?? ?spi1 = &virtio_spi; ? ? ? ? ? // virtio-spi

? ? ? ? ? ? };

????????

?????

/SD-HQX4.5.6.0/apps_kernel/kernel_platform/qcom/proprietary/devicetree/qcom/quin-vm-common.dtsi

? ? virtio_spi:virtio_spi@1cd12000{

? ? ? ? compatible = "virtio,mmio";

? ? ? ? reg = <0x1cd12000 0x1000>;

? ? ? ? interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;

? ? ? ? virtio,id = <0xC009>;

? ? ? ? status = "ok";

????????? spidev@0 {

? ? ????????? ? compatible = "qcom,spi-msm-codec-slave";

? ? ? ????????? reg = <0>;

? ? ? ????????? spi-max-frequency = <10000000>;

? ? ? ????????? spi-cpha;

? ? ????????? ? // qcom,disable-dma;

? ? ? ????????? status = "ok";

? ????????? };

? ? };

這里需要注意兩點

1 ?DTSI中的節點地址和中斷號要和 上述步驟三中 la.config一致, PS:中斷號一致不是數值一樣,而是符合linux規則,軟件中斷號和硬件中斷號相差32,即對應關系 是 79+32=111

? ? ? ? 這兩個數值在這兩處一致即可,可任意編寫,但不要和其他數值沖突 ?PS:建議同時比對 la.config (現狀不沖突)和 DTS中其他值(防止和未來某項沖突)

2 本身希望生成的設備節點和QNX一致為 /dev/spi1 ,但由于高通base設計

3?? virtio,id = <0xC009>; 這個數值是怎么來的

需要閱讀?/SD-HQX4.5.6.0/lagvm/LINUX/android/kernel_platform/msm-kernel/drivers/spi/virtio-spi.c 代碼

? ?從這基本能看到 Virtio-spi的加載邏輯,通過 module_virtio_drviver加載了對應模塊,再通過id_table查找對應設備,而設備ID的宏值 VIRTIO_ID_SPI 定義如下 49161

通過HEX轉換,即為C009

測試

spidev_test 命令

詳細參考:/SD-HQX4.5.6.0/lagvm/LINUX/android/kernel_platform/msm-kernel/tools/spi/spidev_test.c

spidev_test -D /dev/spidev1.0 -H 1 -p '\x7c\x50'

測試結果 OK

(●'?'●)~,此方法簡要描述了配置和測試方法, 是不是很簡單!。

點到為止,舉一反三!

參考網站

黑莓官方資料:

- VirtIO (qnx.com)

- Physical devices (qnx.com)- vdev ioapic (qnx.com)

通信調試方法:

高通 8255 基本通信(QUP)Android側控制方法說明_高通8255-CSDN博客

高通8255 Uart IIC SPI 測試方法_i2cdbgr-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89727.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89727.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89727.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零手寫紅黑樹(C++實現詳解)

目錄 一、紅黑樹概述 二、紅黑樹節點設計 (1)枚舉紅黑 &#xff08;2&#xff09;紅黑樹的節點設計 三、紅黑樹核心實現:Insert 1.首先將節點遍歷到對應位置創建對應節點并插入到二叉搜索樹對應的位置 2.本文重點的重點 &#xff08;1&#xff09;parent為黑時直接插入即…

【黃山派-SF32LB52】—硬件原理圖學習筆記

目錄 一、硬件介紹 二、芯片主控 1.模組介紹 2.原理圖介紹 3.模組供電電路 三、電源轉換部分 1.OVP過壓保護電路 2.CHG充電電路 3.系統電源橋接電路 4.LDO電路 四、Debug電路 1.一鍵下載電路 五、QSPI屏幕 六、SD卡 七、AUDIO音頻 八、GPIO電路 1.按鍵部分…

從五次方程到計算機:數學抽象如何塑造現代計算

引言 數學的發展往往始于一個具體的問題&#xff0c;而后在尋求解答的過程中&#xff0c;催生出深刻的抽象理論。從五次方程的求解到抽象代數&#xff0c;再到范疇論和λ演算&#xff0c;最終影響圖靈機和現代計算機的設計&#xff0c;這一歷程展現了數學如何從實際問題演變為通…

劇本殺小程序開發:科技賦能,重塑推理娛樂新形態

在科技飛速發展的今天&#xff0c;各個行業都在積極探索與科技的融合&#xff0c;以實現創新發展。劇本殺行業也不例外&#xff0c;劇本殺小程序的開發&#xff0c;正是科技賦能傳統娛樂的生動體現&#xff0c;它重塑了推理娛樂的新形態&#xff0c;為玩家帶來了前所未有的游戲…

機器學習sklearn入門:歸一化和標準化

bg&#xff1a;歸一化&#xff08;Normalization&#xff09;通常指將數據按比例縮放至某個特定范圍&#xff0c;但具體范圍并不一定是固定的 0到1。標準化是將數據轉換成均值為0&#xff0c;標準差為1的分布。使用場景&#xff1a;用歸一化&#xff1a;需要嚴格限定范圍&#…

【Project】kafka+flume+davinci廣告點擊實時分析系統

一、項目需求分析 某電商平臺需實現廣告實時點擊分析系統&#xff0c;核心需求為實時統計以下內容的Top10&#xff1a; 各個廣告的點擊量各個省份的廣告點擊量各個城市的廣告點擊量 通過實時掌握廣告投放效果&#xff0c;為廣告投放策略調整和大規模投入提供依據&#xff0c;以…

JAVA后端開發——success(data) vs toAjax(rows): 何時用

toAjax(int rows)用途&#xff1a;用于不返回任何數據的 “寫” 操作&#xff08;增、刪、改&#xff09;。工作原理&#xff1a;它只接收一個 int 類型的參數&#xff08;通常是數據庫操作影響的行數&#xff09;。它只關心這個數字是不是大于0&#xff0c;然后返回一個通用的…

pdf格式怎么提取其中一部分張頁?

想從PDF里提取幾個頁面&#xff0c;辦法還挺多的&#xff0c;下面給你嘮嘮常見的幾種&#xff0c;保準你一看就懂。一、用專業PDF編輯軟件提取 像Adobe Acrobat&#xff0c;這可是PDF編輯界的“老手”了。你先把要處理的PDF文件在Adobe Acrobat里打開&#xff0c;接著找到菜單欄…

Spring監聽器

1、監聽器的原理 ApplicationListener<T>是Spring框架中基于觀察者模式實現的事件監聽接口&#xff0c;用于監聽應用程序中特定類型的事件。該接口是一個函數式接口&#xff0c;從Spring 4.2開始支持Lambda表達式實現。 接口定義如下&#xff1a; FunctionalInterface …

基于Rust游戲引擎實踐(Game)

Rust游戲引擎推薦 以下是一些流行的Rust游戲引擎,適用于不同開發需求: Bevy 特點:數據驅動、模塊化設計,支持ECS架構,適合初學者和復雜項目。 適用場景:2D/3D游戲、原型開發。 Amethyst 特點:成熟的ECS框架,支持多線程,社區活躍。 適用場景:大型游戲或高性能應用。…

PyTorch 數據加載實戰:從 CSV 到圖像的全流程解析

目錄 一、PyTorch 數據加載的核心組件 1.1 Dataset 類的核心方法 1.2 DataLoader 的作用 二、加載 CSV 數據實戰 2.1 自定義 CSV 數據集 2.2 使用 TensorDataset 快速加載 三、加載圖像數據實戰 3.1 自定義圖像數據集 3.2 使用 ImageFolder 快速加載 四、加載官方數據…

程序人生,開啟2025下半年

時光匆匆&#xff0c;2025年已然過去一半。轉眼來到了7月份。 回望過去上半年&#xff0c;可能你也經歷了職場的浮沉、生活的跌宕、家庭的變故。 而下半年&#xff0c;生活依舊充滿了各種變數。 大環境的起起伏伏、生活節奏的加快&#xff0c;都讓未來的不確定性愈發凸顯。 在這…

在 .NET Core 中創建 Web Socket API

要在 ASP.NET Core 中創建 WebSocket API&#xff0c;您可以按照以下步驟操作&#xff1a;設置新的 ASP.NET Core 項目打開 Visual Studio 或您喜歡的 IDE。 創建一個新的 ASP.NET Core Web 應用程序項目。 選擇API模板&#xff0c;因為這將成為您的 WebSocket API 的基礎。在啟…

Python 之地址編碼識別

根據輸入地址&#xff0c;利用已有的地址編碼文件&#xff0c;構造處理規則策略識別地址的編碼。 lib/address.json 地址編碼文件&#xff08;這個文件太大&#xff0c;博客里放不下&#xff0c;需要的話可以到 gitcode 倉庫獲取&#xff1a;https://gitcode.com/TomorrowAndT…

kafka的部署

目錄 一、kafka簡介 1.1、概述 1.2、消息系統介紹 1.3、點對點消息傳遞模式 1.4、發布-訂閱消息傳遞模式 二、kafka術語解釋 2.1、結構概述 2.2、broker 2.3、topic 2.4、producer 2.5、consumer 2.6、consumer group 2.7、leader 2.8、follower 2.9、partition…

小語種OCR識別技術實現原理

小語種OCR&#xff08;光學字符識別&#xff09;技術的實現原理涉及計算機視覺、自然語言處理&#xff08;NLP&#xff09;和深度學習等多個領域的融合&#xff0c;其核心目標是讓計算機能夠準確識別并理解不同語言的印刷或手寫文本。以下是其關鍵技術實現原理的詳細解析&#…

GPT:讓機器擁有“創造力”的語言引擎

當ChatGPT寫出莎士比亞風格的十四行詩&#xff0c;當GitHub Copilot自動生成編程代碼&#xff0c;背后都源于同一項革命性技術——**GPT&#xff08;Generative Pre-trained Transformer&#xff09;**。今天&#xff0c;我們將揭開這項“語言魔術”背后的科學原理&#xff01;…

LeetCode|Day19|14. 最長公共前綴|Python刷題筆記

LeetCode&#xff5c;Day19&#xff5c;14. 最長公共前綴&#xff5c;Python刷題筆記 &#x1f5d3;? 本文屬于【LeetCode 簡單題百日計劃】系列 &#x1f449; 點擊查看系列總目錄 >> &#x1f4cc; 題目簡介 題號&#xff1a;14. 最長公共前綴 難度&#xff1a;簡單…

安全事件響應分析--基礎命令

----萬能密碼oror1 or # 1or11 1 or 11安全事件響應分析------***windoes***------方法開機啟動有無異常文件 【開始】?【運行】?【msconfig】文件排查 各個盤下的temp(tmp)相關目錄下查看有無異常文件 &#xff1a;Windows產生的 臨時文件 可以通過查看日志且通過篩…

基于C#+SQL Server實現(Web)學生選課管理系統

學生選課管理系統的設計與開發一、項目背景學生選課管理系統是一個學校不可缺少的部分&#xff0c;傳統的人工管理檔案的方式存在著很多的缺點&#xff0c;如&#xff1a;效率低、保密性差等&#xff0c;所以開發一套綜合教務系統管理軟件很有必要&#xff0c;它應該具有傳統的…