博客
关于我
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学习总结(71)——数据库介绍(MySQL安装 体系结构、基本管理)再回顾
查看>>
Mysql学习总结(72)——MySQL 开发者开发,设计规范再总结
查看>>
Mysql学习总结(73)——MySQL 查询A表存在B表不存在的数据SQL总结
查看>>
Mysql学习总结(74)——慢SQL!压垮团队的最后一根稻草!
查看>>
Mysql学习总结(75)——并发量大、数据量大的互联网业务数据库设计军规
查看>>
Mysql学习总结(76)——MySQL执行计划(explain)结果含义总结
查看>>
Mysql学习总结(77)——温故Mysql数据库开发核心原则与规范
查看>>
Mysql学习总结(78)——MySQL各版本差异整理
查看>>
Mysql学习总结(79)——MySQL常用函数总结
查看>>
Mysql学习总结(7)——MySql索引原理与使用大全
查看>>
Mysql学习总结(80)——统计数据库的总记录数和库中各个表的数据量
查看>>
Mysql学习总结(81)——为什么MySQL不推荐使用uuid或者雪花id作为主键?
查看>>
Mysql学习总结(82)——MySQL逻辑删除与数据库唯一性约束如何解决?
查看>>
Mysql学习总结(83)——常用的几种分布式锁:ZK分布式锁、Redis分布式锁、数据库分布式锁、基于JDK的分布式锁方案对比总结
查看>>
Mysql学习总结(84)—— Mysql的主从复制延迟问题总结
查看>>
Mysql学习总结(85)——开发人员最应该明白的数据库设计原则
查看>>
Mysql学习总结(8)——MySql基本查询、连接查询、子查询、正则表达查询讲解
查看>>
Mysql学习总结(9)——MySql视图原理讲解与使用大全
查看>>
Mysql学习笔记 - 在Centos7环境下离线安装Mysql
查看>>
MySQL学习笔记十七:复制特性
查看>>