博客
关于我
05-SA8155 QNX SPI框架及代码分析
阅读量:797 次
发布时间:2023-03-22

本文共 2647 字,大约阅读时间需要 8 分钟。

QNX SPI驱动器开发指南

1. 描述

本文旨在介绍QNX操作系统下的SPI(串行总线)驱动开发,重点以SA8155处理器为例,详细讲解SPI框架的实现和相关API。

2. 目录结构

2.1 硬件驱动

硬件驱动位于apps/qnx_ap/AMSS/platform/hwdrivers/wired_peripherals/spi目录下,包含以下子目录:

  • aarch64arm:分别对应不同处理器架构下的驱动源文件。
  • common.mk:通用Makefile,用于编译驱动。
  • device:驱动的核心实现文件,包括头文件和源文件。
  • driver:驱动接口定义和实现。
  • logs:驱动日志管理。
  • Makefile:项目编译配置文件。
  • public:公开接口和资源管理器。

2.2 SPI资源管理器

资源管理器位于apps/qnx_ap/AMSS/platform/resources/spi_drv,主要包含以下文件:

  • spi_drv.c:资源管理器核心实现文件。
  • spi_lib.h:常用库函数接口定义。
  • spi_devctls.h:设备控制常量定义。

2.3 SPI服务进程

SPI服务进程位于/apps/qnx_ap/AMSS/platform/services/daemons/spi_service,主要实现以下功能:

  • 初始化SPI驱动。
  • 启动后台服务进程。

2.4 API

API位于apps/qnx_ap/AMSS/platform/qal/clients/spi_clientapps/qnx_ap/qnx_bins/prebuilt_QNX700/target/qnx7/usr/include/hw/spi-master.h,主要包括以下函数:

  • spi_open:打开SPI设备。
  • spi_close:关闭SPI设备。
  • spi_setcfg:设置SPI配置。
  • spi_getdevinfo:获取设备信息。
  • spi_getdrvinfo:获取驱动信息。
  • spi_read:读取数据。
  • spi_write:写入数据。
  • spi_xchange:数据交换。
  • spi_cmdread:命令读取。
  • spi_dma_xchange:DMA数据交换。
  • spi_dma_xfer:DMA数据传输。

3. SPI资源管理器设计

在QNX系统中开发驱动程序,主要任务是构建兼容POSIX系统且支持资源管理器框架的驱动。资源管理器需要实现与操作系统的兼容性,通过main函数接收命令行参数,利用options函数实现可选特性。

4.1 Spi Service Demo进程

spi_service.c主要作为壳文件,核心功能包括:

  • 调用spi_drv.c初始化驱动。
  • 启动后台服务进程。

4.2 spi资源管理器核心spi_drv.c

spi_drv_init函数是驱动的入口点,实现以下步骤:

  • 初始化设备树。
  • 创建资源管理器线程。
  • 注册设备和服务。

4.3 API与资源管理器关联

资源管理器通过以下API与应用程序交互:

  • devctl:设备控制函数。
  • open:打开设备文件。
  • read:读取数据。
  • write:写入数据。

5. APP示例

以下是一个使用SPI驱动进行通信的示例:

#include 
#include
#include
#include
#include "mmdefs.h"
#include "log.h"
#include "spi_driver.h"
#define DEVICE_NAME "/dev/spi1"
static int fd = 0;
int SPI_Init() {
fd = spi_open(DEVICE_NAME);
if (fd == -1) {
LOG("spi_open failed\n");
fd = 0;
} else {
spi_cfg_t cfg;
cfg.mode = SPI_MODE_BODER_MSB | SPI_MODE_CSHOLD_HIGH | SPI_MODE_CKPHASE_HALF;
cfg.clock_rate = 2000000;
int rc = spi_setcfg(fd, SPI_DEVICE_1, &cfg);
if (rc) {
LOG("spi_setcfg failed\n");
close(fd);
fd = 0;
}
}
return fd;
}
void SPI_Deinit() {
if (fd) {
spi_close(fd);
fd = 0;
}
}
int SPI_Write(uint8_t *buf, uint32_t len) {
if (fd) {
return spi_write(fd, SPI_DEVICE_1, buf, len);
} else {
return -1;
}
}
int SPI_Read(uint8_t *buf, uint32_t len) {
if (fd) {
return spi_cmdread(fd, SPI_DEVICE_1, NULL, 0, buf, len);
} else {
return -1;
}
}
int SPI_Write_Read(uint8_t *tx_buf, uint8_t *rx_buf, uint32_t len) {
if (fd) {
return spi_cmdread(fd, SPI_DEVICE_1, tx_buf, len, rx_buf, len);
} else {
return -1;
}
}

本文详细介绍了QNX SPI驱动器的开发流程,涵盖了从硬件驱动到应用程序的整个开发过程。

转载地址:http://pfqfk.baihongyu.com/

你可能感兴趣的文章
MangoDB4.0版本的安装与配置
查看>>
Manjaro 24.1 “Xahea” 发布!具有 KDE Plasma 6.1.5、GNOME 46 和最新的内核增强功能
查看>>
mapping文件目录生成修改
查看>>
MapReduce程序依赖的jar包
查看>>
mariadb multi-source replication(mariadb多主复制)
查看>>
MariaDB的简单使用
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>
Memcached:Node.js 高性能缓存解决方案
查看>>
memcache、redis原理对比
查看>>
memset初始化高维数组为-1/0
查看>>
Metasploit CGI网关接口渗透测试实战
查看>>
Metasploit Web服务器渗透测试实战
查看>>
MFC模态对话框和非模态对话框
查看>>
Moment.js常见用法总结
查看>>
MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
查看>>
mxGraph改变图形大小重置overlay位置
查看>>
MongoDB可视化客户端管理工具之NoSQLbooster4mongo
查看>>