博客
关于我
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 - 4种基本索引、聚簇索引和非聚索引、索引失效情况、SQL 优化
查看>>
MySQL - ERROR 1406
查看>>
mysql - 视图
查看>>
MySQL - 解读MySQL事务与锁机制
查看>>
MTTR、MTBF、MTTF的大白话理解
查看>>
mt_rand
查看>>
mysql -存储过程
查看>>
mysql /*! 50100 ... */ 条件编译
查看>>
mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
查看>>
mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
查看>>
mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
查看>>
mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
查看>>
MySQL 8.0 恢复孤立文件每表ibd文件
查看>>
MySQL 8.0开始Group by不再排序
查看>>
mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
查看>>
multi swiper bug solution
查看>>
MySQL Binlog 日志监听与 Spring 集成实战
查看>>
MySQL binlog三种模式
查看>>
multi-angle cosine and sines
查看>>
Mysql Can't connect to MySQL server
查看>>