博客
关于我
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数据库简单的状态检查(show status)
查看>>
MySQL数据库系列
查看>>
MYSQL数据库自动本地/异地双备份/MYSQL增量备份
查看>>
mysql数据库表增添字段,删除字段、修改字段的排列等操作,还不快来
查看>>
MySQL数据库被黑了
查看>>
mysql数据库设计
查看>>
MySQL数据库设计与开发规范
查看>>
MYSQL数据库进阶操作
查看>>
MySQL数据库配置文件调优详解
查看>>
MySQL数据库酒店客房管理系统(含MySQL源码) 结课作业 做的不是很好
查看>>
mysql数据库里的一些坑(读高性能mysql有感)
查看>>
MySQL数据库面试题(2021最新版)
查看>>
MySQL数据库高并发优化配置
查看>>
mysql数据恢复
查看>>
MySQL数据的主从复制、半同步复制和主主复制详解
查看>>
mysql数据碎片整理
查看>>
MySQL数据类型
查看>>
MySQL数据类型字节长度
查看>>
mysql数据被误删的恢复方案
查看>>
MySQL数据读写分离(MaxScale)上干货!!!
查看>>