博客
关于我
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/

你可能感兴趣的文章
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 添加列,修改列,删除列
查看>>
mysql 添加索引
查看>>
MySQL 添加索引,删除索引及其用法
查看>>
mysql 状态检查,备份,修复
查看>>
MySQL 用 limit 为什么会影响性能?
查看>>
MySQL 用 limit 为什么会影响性能?有什么优化方案?
查看>>
MySQL 用户权限管理:授权、撤销、密码更新和用户删除(图文解析)
查看>>
mysql 用户管理和权限设置
查看>>
MySQL 的 varchar 水真的太深了!
查看>>
mysql 的GROUP_CONCAT函数的使用(group_by 如何显示分组之前的数据)
查看>>
MySQL 的instr函数
查看>>
MySQL 的mysql_secure_installation安全脚本执行过程介绍
查看>>
MySQL 的Rename Table语句
查看>>
MySQL 的全局锁、表锁和行锁
查看>>
mysql 的存储引擎介绍
查看>>