目錄
一: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
上述代碼簡要描述
vdev vdev-virtio-spi.so
? 步驟二中提到的 .so,用于將此so提供給Android側使用loc
0x1cd12000
intr gic:111
? 給Android側虛擬的一段地址和中斷號,這兩個參數隨意編寫即可,但不要和其他資源地址和中斷號發生重復和覆蓋,同時要和后續步驟四中DTS描述匹配
verbose 3
:設置日志輸出級別為3(較詳細的調試信息,可以不必過多關注)
device spi1
:指定關聯的QNX配置的 SPI設備為spi1,因為上述qnx配置的是/dev/spi1 所以這里要配置spi1?
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博客