QNX 7.0.0开发总结

1 QNX编译
1.1 基本概念
QNX可以直接使用Linux Makefile编译库和二进制,在Makefile文件中指定CC=aarch64-unknown-nto-qnx7.0.0-g++,或者CC=x86_64-pc-nto-qnx7.0.0-g++,保存退出后,运行source /qnx_sdk_path/qnxsdp-env.sh,然后再运行make即可。

QNX官方不建议直接使用xxx-g++,而是使用q++ -Vxxx,q++通过选项-Vxxx找到对应的g++编译器,如何获取xxx,可以使用q++ -V查询。并且只能将选项-Vxxx加到C语言的CFLAGS或者C++语言的CXXFLAGS中,不能加到其它地方,否则编译会出现各种奇怪的错误。

在q++编译中宏-D_QNX_SOURCE的作用是包括POSIX的头文件,包括数据类型、宏声明、库函数等。如果CXXFLAGS只加了-std=C++11,但没有-D_QNX_SOURCE,就算是包含了头文件unistd.h等,还是无法使用POSIX相关库函数和声明等。C++11先前被称作C++0x。

需要注意的是QNX下Makefile链接线程库使用-pthread而不是Linux风格的-lpthread,而其它的库仍然和Linux一样,需要添加前缀-l,例如-lcrypto。

source /qnx_sdk_path/qnxsdp-env.sh
x86_64-pc-nto-qnx7.0.0-gcc \
-o tcp_server tcp_server.c -lsocket

1.2 showcase
CC = q++
.PHONY: clean

OBJS = src/main.o
CFLAGS = \
        -I./include \
        -Vgcc_ntox86_64_cxx
LDFLAGS = -pthread -lcrypto

# compile every cpp file to object
%.o: %.cpp
        $(CC) $(CFLAGS) -c $^ -o $@
# link all of the objects to hello
hello: $(OBJS)
        $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) \
            -o $@
clean:
        rm -rf $(OBJS)
        rm -rf hello

1.3 QNX proprietary Makefile
variant:
g-le: A debugging version of a little-endian executable
o-le: executable
a-le: static library, a means archive
so-le: shared library

mkdir my_project
cd my_project
mkdir inc
mkdir src
touch common.mk
touch Makefile
addvariant aarch64 o-le

le: little endian
PINFO: package info

1.4 build_files
xxx.build.tmpl:一般一个分区一个build文件。Because .build file does not support MACRO, could use Linux filepp command to replace MACRO.
filepp -DMACRO_TEST=${MACRO_TEST} \
my.build > my.build_new

on -R0x7 pipe &
-R:表示CPU掩码,亲和性;0x7 = 0111,CPU0、CPU1、CPU2,不包含CPU3

mkifs xxx.build.tmpl xxx.ifs
dumpifs xxx.ifs
/proc/boot

2 进程和sepol
2.1 进程优先级
QNX的线程优先级,是一个0 - 255的数字,数字越大优先级越高。所以,优先级0是内核中的idle线程;同时,优先级64是一个分界岭,就是说,优先级1 - 63是非特权优先级,一般用户都可以用,而64 - 255必须是有root权限的线程才可以设。QNX进程或者线程刚创建时的优先级是10。
procnto-smp-instr: Instrumented

2.2 QNX secpol
secpol是QNX 7.0才引入的,类似于Android sepolicy,运行on命令时指定参数-T xxx_service_t即可。
编译时需要将SDK 7.0中的aarch64le/bin/secpol和aarch64le/bin/secpolmonitor(不能与secpolgenerate同时运行,因为这2个命令用到同一个目录,运行有冲突)集成到image中。

allow_attach: resmgr_attach()
allow_link: pathmgr_symlink()

__SECURE_BOOT_SECPOL__
allow_attach io_pkt_v6_hc_t {
    /path/to/socket_name
};

/proc/boot/secpol.bin
secpolmonitor -pasno /tmp/secpol.out &
secpolmonitor -pasno /tmp/secpol.out \
-S subrangedAble &
genpol

2.3 列出所有的进程加载了哪些so库
pidin -F "%O"

3 console
3.1 Android vdev console
# x86 vdev ser8250
# aarch64 ttyAMA0
# fdtdump, qnx Configuring guests
vdev vdev-pl011.so
    loc 0x1c090000
    intr gic:37

3.2 命令
To attach to an existing session:
dtach -a <socket> <options>

Detach from a session
In an attached session, type Ctrl+\

QVM <-> dtach server <-> dtach client <-> QNX shell
ptsname slave (QNX QVM) <-> /dev/ptmx master (QNX dtach, other node by QNX) <-> /tmp/console (QNX dtach, unix-domain socket server) <-> dtach client (dtach -a /tmp/console) <-> QNX shell

3.3 dtach showcase
server:
on -T xxx_t -u 0:0 \
-d /usr/bin/dtach \
-n /path/to/socket_name \
-r winch qvm @/vm/images/linux-la.config

-T apply secpol type to dtach
-u uid:gid
-d daemon
-n new session
-r redraw, winch means windows change

client:
dtach -a /path/to/socket_name
-a attach

3.4 slogger
https://github.com/christianzeroc/openqnx
slog2info是slogger2的客户端。

4 Block
4.1 Block设备
/dev/hd0t12 - t表示type,12表示FAT32分区
/dev/hd1t6 - t表示type,6表示文件系统类型FAT
/fs/usb0
fdisk /dev/hd1 show
dinit:disk initialization

[25-Jan-2022]
mount block device as read write, find command from .build file.
mount -tqnx6 -u -w /dev/xxx /xxx

4.2 Android和QNX共享数据
QNX ->
ls /dev/hd0.*
mkdosfs /dev/hd0.xxx
mount -t dos /dev/hd0.xxx /mnt

Android ->
ls -al /dev/block/by-name/
mount -t vfat -o sync,rw /dev/block/vda17 /mnt/share

5 Display
5.1 keyboard
vdev vdev-virtio-input.so

/usr/share/keyboard/US_101.kbd
slog2info  | grep screen
slog2info  | grep qvm

5.2 screen
#include <screen/screen.h>
screen_set_event_property_iv()
iv: integer value
cv: char value

6 Network
6.1 FreeBSD
QNX network commands all come from BSD family.
ral0: devnp-ral.so, Ralink
wm0: devnp-e1000.so, wiseman, name comes from FreeBSD

nw_dll_syms
https://github.com/ownmac/qnx_drv/tree/master/hardware/devnp/e1000

6.2 Basic Commands
io-pkt-v6-hc: hardware crypto, crypto is OpenSSL library.

# TUNnel: peer=/dev/qvm/la/la_to_host,\
# bind=/dev/vdevpeer/vp0,
on io-pkt-v6-hc -d vdevpeer-net \
peer=/dev/qvm/la/la_to_host,\
bind=/dev/vdevpeer/vp0,\
mac=bbbbbbbbbbbb

# mount -T io-pkt -o <options>
# options for network driver
# unload eth0 driver
# call driver xxx_detach()
ifconfig eth0 destroy

ifconfig bridge0 create
ifconfig bridge0 destroy
brconfig bridge0 delete eth0

6.3 iptables NAT for hypervisor
PREROUTING:DNAT专用。
POSTROUTING:SNAT专用。
MASQUERADE:SNAT转换时,如果--to-source的地址经常变化,那么就无法在iptables命令中固定,譬如路由器WAN口上的IP地址,内网设备通过WAN口访问外网时,只要指定使用MASQUERADE参数,iptables就会统一将内网设备的IP地址替换为路由器WAN口的IP地址。
Figure 6-1 NAT chain

vp0: 192.168.0.98 (QNX veth)
eth0: 192.168.0.99 (Android veth)
eth1: 192.168.5.99 (Android USB Ethernet)

Because PC could not get QNX vp0 MAC, so use the following commands for NAT, PC client should connect eth1 IP.
# client -> eth1 -> eth0 -> vp0 -> server
iptables -I FORWARD 1 -i eth1 -o eth0 -j ACCEPT
iptables -I FORWARD 1 -i eth0 -o eth1 -j ACCEPT
iptables -t nat -A PREROUTING -i eth1 -j DNAT --to-destination 192.168.0.98
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

6.4 QNX sshd
passwordless登陆,QNX Neutrino 6.6.0用户密码加密默认算法是SHA-512,1000轮计算,并附带16字节的盐值。
1) Windows puttygen产生公匙和私匙.ppk
2) Windows WinSCP导入私匙.ppk
3) 将Windows puttygen产生的公匙转换为QNX的格式
QNX shell:
ssh-keygen -i -f win_rsa.pub > /path/to/authorized_keys
4) /path/to/sshd_config
StrictModes no
PasswordAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile /path/to/authorized_keys

6.5 Windows as ssh server
1) Install ssh server for Win10: BvSshServer (original name is WinSSHD)
https://www.bitvise.com/ssh-server-download
Bitvise SSH Server installer

a) Personal Edition
b) Open easy settings
c) Server settings
d) Virtual accounts
- Virtual account password
- test/888888
- Save changes
e) Start Server

2) 在QNX环境下,将Windows下的文件复制到QNX系统中:
scp -S /path/to/ssh virtual_account_name@192.168.3.181:/d:/test/config.ips  /tmp
如果ssh不在/usr/bin/ssh下,需要给scp指定-S参数,否则scp执行失败。

6.6 QNX Momentics Debug
1) QNX shell
Run qconn, default qconn port: 8000
Enable bridge or NAT

2) Windows Momentics IDE
[Windows][Perspective][Open Perspective][QNX System Information]
[Target Navigator][New QNX Target]

Configure IP and 8000, then Momentics will connect to QNX automatically.

6.7 eAVB
ptpd-avb: gPTP
ptpd: IEEE1588 v2

6.8 QNX adb test
1) Android
ip route get <X.Y.Z.5>
ip rule add to X.Y.Z.0/24 lookup main pref 9999

setprop service.adb.tcp.port 5555
stop adbd
start adbd
iptables-save | grep 5555
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 5555 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m tcp --dport 5555 -j ACCEPT
2) QNX
mount block device as read write, find command from .build file.
mount -tqnx6 -u -w /dev/xxx /xxx
Copy libnbutil.so.1 to /path/to/lib as LD_LIBRARY_PATH shown.
route get <ANDROID_IP>
adb connect <ANDROID_IP>
adb shell

7 x86 USB
7.1 FreeBSD
QNX USB API and umass (src/sys/dev/usb/umass.c) all come from BSD family.
FreeBSD SCSI software architecture is called CAM (Common Access Method), it developed by Future Domain and other SCSI vendors. Linux has little support for a SCSI CAM system yet (mainly for booting from hard disk). CAM even supports target mode, so one could disguise ones computer as a peripheral hardware device (e.g. for a small SCSI net).

7.2 usblauncher_otg
client communicates with io-usb through /dev/io-usb/io-usb
pps: Persistent Publish/Subscribe
/pps/qnx/device/usb_ctrl
usbd_alloc(): /memory/below4G, pidin syspage=asinfo (Address Space Information)

pidin -p qvm irqs
while true; do /bin/slay qvm; \
if [ $? -ne 1 ]; then break; fi; \
done

io-usb-otg -d xhci
devb-umass cam pnp
usb -vvvv

slay devb-umass

7.3 USB PHY Tunning
1) QNX设备地址映射函数
#include <sys/mman.h>
#include <sys/neutrino.h>
ThreadCtl(_NTO_TCTL_IO, 0); 
void *ptr = mmap_device_memory(0,
    len,
    PROT_READ|PROT_WRITE| \
    PROT_NOCACHE,
    0,
    0xb8000);
if (ptr == MAP_FAILED) {}

2) in32_x86 and out32
# get xHCI BAR0 in QNX, skip bit0-bit3 of BAR0
pci-tool -d 0:21:0 --read=CFG:0x10

# APL (Gen9, A39X0) 8-port MPH xHCI PORTSC1
in32_x86 <addr from the last step + 0x480>

7.4 x86 xHCI透传
APL (Gen9, A39X0) 8-port MPH xHCI透传给Android后,尽管在QNX下可以使用in32_x86命令和函数mmap_device_memory()读写xHCI寄存器,但是由于IOMMU中仍然有xHCI的DMAR和INTR配置,所以即使卸载Android端xHCI驱动,加载QNX端xHCI驱动,也不会工作;要想让xHCI在QNX下可以工作,需要删除xHCI在IOMMU中的DMAR和INTR配置。

8 x86 GPIO
8.1 P2SB
PCH(
Platform Controller Hub)上大部分设备可以通过PCIe或IO方式访问,但PCH上部分设备需要访问PCH的私有空间,这部分空间通过P2SB(Primary to SideBand)的SBREG_BAR寄存器映射到内存空间,这段空间被称为PCRPCH Private Configuration Space Register。每个设备对应一个PortID,PortID表示设备在PCR空间的偏移量,再加上寄存器偏移可以获取寄存器的地址。

8.2 P2SB GPIO
x86下GPIO寄存器位于PCH的私有空间。GPIO被分组,每组对应一个PCR的PortID。GPIO community和PortID的对应关系如下所示。
SouthWest: 0xC0
NorthWest: 0xC4
North: 0xC5
West: 0xC7

每个community的每个GPIO有2个寄存器,分别是PADCFG0(偏移0)和PADCFG1(偏移4),2个寄存器占用8个字节的地址,所以计算某个GPIO 2个寄存器的绝对地址方法如下,其中PortID是每个GPIO community在PCR空间的偏移量。
基地址pad_regs = 0xf8000000(P2SB bar0) + (PortID << 16) + 0x500(read from PADBAR);
某个GPIO padcfg0的绝对地址 = pad_regs + PADCFG0 + 在bank内的GPIO编号 x 8;
某个GPIO padcfg1的绝对地址 = pad_regs + PADCFG1 + 在bank内的GPIO编号 x 8;

每个community的32个GPIO公用2个寄存器,分别是GPI_IS(GPI Interrupt Status)和GPI_IE(GPI Interrupt Enable),2个中断相关寄存器的绝对地址计算方法如下,其中PortID是每个GPIO community在PCR空间的偏移量。
基地址regs = 0xf8000000(P2SB bar0) + (PortID << 16);
某个GPIO GPI_IS的绝对地址 = regs + 0x100(GPI_IS)+ 在bank内的GPIO编号 / 32;
某个GPIO GPI_IE的绝对地址 = regs + 0x110(GPI_IE)+ 在bank内的GPIO编号 / 32;


/sys/class/gpio/gpiochip434/label
跟dts或者ACPI dsl文件对应上,是哪一组

gpiochip434 - North
gpiochip357 - Northwest
gpiochip310 - West
gpiochip267 - Southwest

9 Abbreviations
APIC:读作ei pic
APS:adaptive partitioning
CAM:UNIX/QNX SCSI Common Access Methods
dtach:detach
hogs:List the processes that are hogging the CPU
IFS:Image File System,QNX系统镜像
IPL:Image Program Loader,bootloader程序
mbuf: Unix TCP/IP message buffer
OCP:Open Core Protocol
OpenUSBDI: Open USB Driver Interface
P2SB:Primary to SideBand
pbuf: lwip packet buffer
pidin:类似于Linux ps,也可以执行pidin arg
PPS: QNX Persistent Pusblish/SubScribe
QNX: Quick UNIX
slay <pid>:kill进程
slm: System Launch and Monitor
smmuman:IOMMU/SMMU Manager
ttyAMA: ARM AMBA PL011
vp0: vdevpeer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/22758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端canvas绘图,利用canvas在图片上面绘制标记以及给canvas添加点击事件。

前端canvas绘图&#xff0c;利用canvas在图片上面绘制标记以及给canvas添加点击事件。 需要实现的效果如下图: 首先需要一个承载的核心画布 <canvas id"canvas" width"800" height"600"></canvas>全部代码&#xff1a; <!DOCT…

LabVIEW减压阀和温控阀综合测试系统

在使用LabVIEW开发阀门测试软件时&#xff0c;特别是针对减压阀和温控阀&#xff0c;测试内容和注意事项包括以下方面&#xff1a; 测试内容 压力测试&#xff1a; 入口压力&#xff1a;测量阀门在不同入口压力下的表现。 出口压力&#xff1a;确保减压阀能够将出口压力控制在…

systemctlm-cosim-demo项目分析

概述 systemctlm-cosim-demo项目是Xilinx的systemc库的demo工程。 环境安装 qemu安装 cd xilinx_proj/Downloads git clone https://github.com/Xilinx/qemu.git cd qemu git checkout 74d70f8008# Configure and build # zynq7000 # ./configure --target-list"arm-s…

【乐吾乐3D可视化组态编辑器】用开关控制巡检车和路灯

一、运动设备开关控制 3D组态编辑器地址&#xff1a;3D可视化组态 - 乐吾乐Le5le 1.在场景中新建模拟运动设备及控制面板&#xff1a;启动/停止 2.单击巡检车设备新建模拟动画 3.设置模拟动画属性 4.单击启动面板&#xff0c;新建交互事件 5.设置交互触发类型&#xff0c;新建…

PS系统教程11

HUD拾色器 作用&#xff1a;它可以帮助使用者更加高效地选择和使用颜色&#xff0c;从而提高工作效率和设计质量。 先确定色相值改变饱和度改变亮度使用HUD拾色器选中画笔工具画笔模式-正常shiftAlt右键 色相轮 上下移动从黑到白亮度变化左右移动从浅到深饱和度的变化选中颜…

数据分析必备:一步步教你如何用Pandas做数据分析(17)

1、Pandas 连接 Pandas 连接的操作实例 Pandas具有与SQL等关系数据库非常相似的功能齐全的高性能内存中连接操作。 Pandas提供单个功能merge作为DataFrame对象之间所有标准数据库联接操作的入口点 pd.merge(left, right, howinner, onNone, left_onNone, right_onNone,left_i…

新手必看!现货伦敦金新手容易犯的两个错

对很多刚进入现货伦敦金市场的朋友来说&#xff0c;炒伦敦金是十分令人兴奋的&#xff0c;但兴奋归兴奋&#xff0c;我们还是要注意&#xff0c;由于现货伦敦金投资者过分的热情&#xff0c;很容易让自己跌入一些陷阱&#xff0c;犯下一些错误&#xff0c;下面我们就来介绍两个…

智能楼宇安防3D数据可视化平台满足日益增长的安防需求

在当今社会&#xff0c;安全是每个人和企业最为关心的问题。为满足日益增长的安防需求&#xff0c;3D可视化公司深圳华锐视点隆重推出安防平台3D可视化管理系统&#xff0c;以先进的三维技术为您的安全保驾护航。 安防平台3D可视化管理系统通过创新的三维可视化技术&#xff0c…

纷享销客BI智能分析平台技术架构介绍

纷享销客BI智能分析平台致力于降低用户上手门槛&#xff0c;无缝继承纷享销客PaaS平台的对象关系模型和权限体系&#xff0c;让使用纷享CRM的营销人员、销售人员、服务人员等各类角色人员都能够将分析场景与业务场景相融合&#xff0c;将数据思维融合到自己的日常工作、团队工作…

SpringCloud-面试篇(二十三)

&#xff08;1&#xff09;SpringCloud常见组件有那些 有无数微服务需要相互调用&#xff1a;可以用远程调用组件OpenFeign组件&#xff0c;也可以用Dobble 这么多微服务相互调用怎么管理&#xff1a;就用到注册中心组件Nacos&#xff0c;Eureka 所有的服务去找注册中心做注…

TCP协议与UDP协议区别

举个列子&#xff1a; 三次握手&#xff1a;为了解决网络信道不可靠的问题&#xff1b;防止客户端向服务端发送两次数据&#xff0c;客户端一直处于接收的状态。 四次挥手是一样的。当客户端提出关闭请求&#xff0c;服务端处于关闭等待状态&#xff0c;此时客户端可以发送数据…

PMP考试难吗?考试通过率有多少?

我们通常以考试的通过率来评判一个考试的难易程度。通常通过率达到60%以上&#xff0c;这个考试就不太难&#xff1b;达到80% &#xff0c;这个考试就是不难的。 PMP考试难吗&#xff1f; 不少想要考PMP的小伙伴都会有这样的疑惑&#xff0c;首先以PMP的含金量来说&#xff0…

产品推荐 | 基于Lattice USB3-GbE VIP IO技术赋能视频接口开发板

1、产品概述 支持视频接口平台 (VIP) – 为莱迪思VIP提供USB 3.0 和千兆以太网网络互连 灵活的快速原型设计和开发– 两个标准的高速连接器实现嵌入式视觉原型系统的简便快速硬件配置 可靠、经验证的即时使用设计– 莱迪思演示设计通过USB 3.0和工业千兆以太网接口实现快速视…

Linux C语言: 数据类型

一、 为什么要引入数据类型 • 计算机中每个字节都有一个地址&#xff08;类似门牌号&#xff09; • CPU通过 地址 来访问这个字节的空间 0x20001103 1 0 0 1 0 0 1 1 0x20001102 1 1 1 0 1 1 1 0 0x20001101 1 1 1 1 0 1 0 1 0x20001100 0 …

accelerate 笔记:梯度同步的时间效率

1 介绍 PyTorch 的分布式模块通过在系统中所有GPU之间进行来回通信来操作。 这种通信需要时间&#xff0c;并且确保所有进程了解彼此的状态在使用ddp模块时会在特定的触发点发生 这些触发点被添加到PyTorch模型中&#xff0c;特别是它们的 forward() 和 backward() 方法中当通…

2024-06-05 Android app jni里面c语言函数申请的局部变量数组过大会导致程序崩溃的问题分析

一、下面是一个app jni里面一个函数&#xff0c;函数里面定义一个数组&#xff0c;实际运行的时候发现数组过大的时候会导致app崩溃。 JNIEXPORT jint JNICALL JNI_FUNCTION(native_1getcapture_1data)(JNIEnv *env, jobject obj,jbyteArray des_data,jbyteArray src_data,jin…

Linux 多线程 生产者消费者 问题

在 Linux 系统中&#xff0c;生产者和消费者问题是一个经典的多线程同步问题&#xff0c;用于描述如何在多线程环境中协调多个线程对共享资源的访问。这个问题通常涉及两个类型的线程&#xff1a;生产者线程和消费者线程。生产者线程负责生成数据并将其放入缓冲区&#xff0c;而…

3D开发工具HOOPS助力PLM/PDM系统创新,高效实现复杂数据精细处理、3D模型交互可视化!

在现代制造和工程领域&#xff0c;PLM&#xff08;产品生命周期管理&#xff09;和PDM&#xff08;产品数据管理&#xff09;已成为企业优化流程和提升竞争力的关键工具。 随着技术的飞速发展&#xff0c;PLM和PDM应用程序需要更先进的工具来处理复杂的CAD数据、实现高效的3D可…

九泰智库-注册讲堂 | 浙江省eRPS系统上线后提交文件要求

浙械eRPS系统(https://ylqx.certca.cn/ylqxonline/)已正式上线启用。 在过渡期内&#xff0c;注册申请人需要同时进行线上医疗器械注册电子申报和提交纸质资料&#xff0c;以确保审评审批工作的顺利进行。过渡期结束时间另行通知。 以下是对电子申报资料格式要求的总结&#…

从零开始:如何通过美颜SDK构建自己的直播美颜工具

今天&#xff0c;我将详细介绍如何通过美颜SDK从零开始构建自己的直播美颜工具。 一、了解美颜SDK 什么是美颜SDK 开发者可以通过集成SDK&#xff0c;快速在应用中实现这些功能&#xff0c;而无需从头编写复杂的图像处理算法。 选择合适的美颜SDK 选择时可以根据以下几个方…