1. 概述
1.1 概念
GENI 通用接口 (Generic interface)
GSI 通用软件接口 (Generic software interface)
QUP 高通通用外设 (Qualcomm universal peripheral)
SE 串行引擎 (Serial engine)
TZ TrustZone
1.2 QUB v3
QUP v3 是一种可编程模块,支持多种串行接口,例如 UART、SPI、I 2 C 和 I 3 C。该模块 支持访问系统中的多个硬件实体。每个硬件实体具备专属执行环境 (EE),独立的地址空 间以及一条中断线。 通过使用内部串行引擎 (SE)/QUP,单一 QUP v3 模块可提供多达八个串行接口。每个接 口可支持的协议由加载到 SE 的固件决定。为此,可通过修改 TZ 中的 QUPAC_Access 文件加载所需协议(I 2 C、SPI 或 UART)。
QUP v3 的主要属性如下:
- 用于串行协议的单核心
- 取代了 BAM 低速外设 (BLSP) 传统核心
- 可编程的核心
1.3 GPIO
每个GPIO引脚标准具有以下功能:
- 输出
- 输入
- 中断输入(不包括特殊唤醒中断功能)
此外,一些gpio后面可能有一个或多个多路复用的硬件块,以实现其他功能。
2. SA8155 QUP配置
2.1 QUP-GPIO Maping映射表
QUP-GPIO Maping
如上图,QUP-GPIO映射表,代码中的配置相关均可以在这个表里查阅。
2.2 QUP资源配置:QUPAC_Access
对于SA8155的QUP访问表是:
tz_8155\trustzone_images\core\settings\buses\qup_accesscontrol\qupv3\config\855\QUPAC_Access.c
如上图所示,QUP资源配置。
2.2.1 案例,I2C资源配置
将QUPV3_SSC_SE0配置为I2C接口,拥有者为AC_HLOS
{ QUPV3_SSC_SE0, QUPV3_PROTOCOL_I2C, QUPV3_MODE_FIFO, AC_HLOS, TRUE, TRUE, FALSE }, // I2C – AUDIO A2B I2C
通过查表:
其他接口资源配置可以参考类似操作。
2.2.2 QUP功能映射关系
拿QUB I2C功能映射举例说明:
如上code,qup_l0 与 qub_l1 就是对应的 QUP lane to Function mapping功能表的L0 与 L1
图: QUP lane to Function mapping
qup_l0[x] qup_l1[x] 数组数值对应的就是QUP numbering as per device specification
qup_l0[0] qup_l1[0] 对应的就是 QUP_SE_0 的L0 与 L1 IO映射的功能配置。如果配置为I2C则是SDA与SCL。如果配置为SPI-master则为MISO与MOSI。
3. HLOS QUP programming
通过QUP programming 来初始化QUB功能以及时钟。
3.1 IO配置
文件路径:
apps/qnx_ap/boards/core/dalconfig/sa8155_adp/sa8155_adp_common/config/pin_config.c
数据结构定义
其中第一列的数值是 | 上一个IO编号。
3.2 I2C配置(例子)
3.2.1 QNX 配置文件
文件:
apps/qnx_ap/boards/core/dalconfig/sa8155_adp/sa8155_adp_common/config/i2c_props_8155.xml
3.2.2 I2C ID与QUP 对应
比如设置I2C1,那么这个I2C1是QUP的哪组呢? QUPV3_0_SE1? 还是QUPV3_0_SE2?
对应关系如下: 通过QUP 地址
如上图,I2C1,QUP地址为0xC94000
那么哪个QUBV3的地址是这个呢? 需要查手册,也可以查LA内核的设备设备树dtsi文件:如下图
3.2.3 I2C设备
i2c_props_8155.xml 配置了三个I2C:
- DALDEVICEID_I2C_DEVICE_1
- DALDEVICEID_I2C_DEVICE_2
- DALDEVICEID_I2C_DEVICE_3
且三个I2C I2C_ENABLED都是1,说明使能。
那么QNX应该会产生三个I2C设备 /dev/下:
3.2.4 I2C 调试
Linux I2C调试工具有i2c-tools 四件套(i2cset,i2cget,i2cdetect,i2cdump)。
那么QNX同样也有调试工具,它就是i2cdbgr (/bin/i2cdbgr)
usage:
# use i2cdbgr
i2cdbgr : Application to perform i2c read / write
Usage: i2cdbgr [node] [slave addr] read [byte size] [offset] [# bytes to read]
i2cdbgr [node] [slave addr] write [byte size] [offset] [value]
where
[node] is of form "/dev/i2cX".
[byte size] is 1, or 2. The value has no effect for read. For write, if the
byte size is 1, then the offset is ignored, and only [value] is written.
If the byte size if 2, then i2cdbgr will write [offset value].
The i2cdbgr uses 8-bit addressing, 8-bit data to read or write from
/dev/i2cX (fd) using i2c_client.h using default frequency.
Examples:
For read:
i2cdbgr /dev/i2c1 0x77 read 1 0x4 1 <- read 1 byte from slave addr 0x77
offset 0x4
i2cdbgr /dev/i2c1 0x77 read 1 0x4 5 <- read 5 bytes from slave addr
0x77 offset 0x4
For write:
i2cdbgr /dev/i2c1 0x77 write 1 0x0 0xa <- write 1 byte to slave addr
0x77 with no offset due to 1 byte size value 0xa
i2cdbgr /dev/i2c1 0x77 write 2 0x1 0xb <- write 2 bytes to slave addr
0x77 with offset + value bytes [0x1 0xb]
4.QNX IO调试
/dev/gpio
4.1 TLMM MSM GPIO tool
工具指令原型:
$msmgpiotool <command> <gpio> <arg>
Command | gpio | arg | 描述 |
info | <gpio num> | 无 | Display the info for the specified TLMM GPIO |
write | <gpio num> | <value> | Write the GPIO pin value |
read | <gpio num> | 无 | Read the GPIO pin value (High or Low) |
rawread | <gpio num> | 无 | Read the GPIO IN_OUT register raw register value |
set-dir | <gpio num> | <value> | Set the GPIO direction |
set-drive | <gpio num> | <value> | Set the GPIO drive strength |
set-pull | <gpio num> | <value> | Set the GPIO drive mode |
set-func | <gpio num> | <value> | Set the GPIO function select |
enable-irq | <gpio num> | <value> | Set the GPIO interrupt source |
clear-irq | <gpio num> | 无 | Clears the pending irq status |
set-pol | <gpio num> | <value> | Sets the GPIO interrupt polarity |
set-trigger | <gpio num> | <value> | Sets the irq trigger type |
QNX 使用方法:
$ msmgpiotool read 8
GPIO 8 is Low
$ msmgpiotool set-dir 8 1
Set GPIO 8 direction to Out [1]
$ msmgpiotool write 8 1
Wrote GPIO 8 to 1
$ msmgpiotool read 8
GPIO 8 is High
4.2 PMIC GPIO tool
工具指令原型
$ pmicgpiotool <command> <gpio> <value>
Tool 命令,与TLMM MSM GPIO tool类似
read <gpio number>
gpio-master <gpio number> <value>
source-select <gpio number> <value>
mode-inversion <gpio number> <value>
voltage-select <gpio number> <value>
pullup-select <gpio number> <value>
output-type <gpio number> <value>
output-drive-select <gpio number> <value>
mode <gpio number> <value>
in-set-type <gpio number> <value>
int-polarity-high <gpio number> <value>
int-polarity-low <gpio number> <value>
int-enable-set <gpio number> <value>
int-enable-clear <gpio number> <value>
int-mid-select <gpio number> <value>
int-priority <gpio number> <value>
今天的文章GPIO_SetBits_UART转I2C分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/87967.html