本文主要描述QNX SPI Drvier的相关内容,并以Texas Instruments DRA71x Jacinto6 Cortex A15处理器为例讲解
在QNX® Neutrino I2C驱动框架与代码分析,我们具体分析了I2C驱动框架与源码的实现,同样在QNX系统里,也提供了SPI驱动框架。
目录结构与组成部分
下面是Texas.Instruments.DRA71x.Jacinto6.Entry.BSP.for.QNX.SDP.6.6包目录,我们只展开跟SPI相关目录内容:
.
├── Makefile
├── images
│ ├── Makefile
│ └── mkflashimage.sh
├── install
├── manifest
├── prebuilt
│ ├── armle-v7
│ │ ├── lib
│ │ │ └── dll
│ │ └── usr
│ │ └── lib
│ │ ├── libspi-master.a
│ │ └── libutil.a
│ └── usr
│ └── include
└── src
├── Makefile
├── hardware
│ ├── spi
│ │ ├── Makefile
│ │ ├── master
│ │ │ ├── Makefile
│ │ │ ├── _spi_close_ocb.c
│ │ │ ├── _spi_create_instance.c
│ │ │ ├── _spi_devctl.c
│ │ │ ├── _spi_devlock.c
│ │ │ ├── _spi_dlload.c
│ │ │ ├── _spi_init_iofunc.c
│ │ │ ├── _spi_iomsg.c
│ │ │ ├── _spi_iomsg_cmdread.c
│ │ │ ├── _spi_iomsg_dmaxchange.c
│ │ │ ├── _spi_iomsg_read.c
│ │ │ ├── _spi_iomsg_write.c
│ │ │ ├── _spi_iomsg_xchange.c
│ │ │ ├── _spi_main.c
│ │ │ ├── _spi_ocb.c
│ │ │ ├── _spi_read.c
│ │ │ ├── _spi_slogf.c
│ │ │ ├── _spi_write.c
│ │ │ ├── arm
│ │ │ ├── common.mk
│ │ │ ├── module.tmpl
│ │ │ ├── project.xml
│ │ │ └── proto.h
│ │ └── omap4430
│ │ ├── Makefile
│ │ ├── arm
│ │ ├── clock_toggle.c
│ │ ├── clock_toggle.h
│ │ ├── common.mk
│ │ ├── config.c
│ │ ├── context_restore.c
│ │ ├── context_restore.h
│ │ ├── intr.c
│ │ ├── module.tmpl
│ │ ├── omap4430spi.c
│ │ ├── omap4430spi.h
│ │ ├── pinfo.mk
│ │ ├── project.xml
│ │ ├── reg_map_init.c
│ │ ├── sdma.c
│ │ ├── sdma.h
│ │ ├── spi-omap4430.use
│ │ └── wait.c
│ ├── startup
│ └── support
└── utils
├── Makefile
└── r
I2C框架由以下部分组成:
hardware/spi/omap4430/* 硬件接口
├── hardware
│ ├── spi
│ │ ├── Makefile
│ │ ├── master
│ │ └── omap4430
│ │ ├── Makefile
│ │ ├── arm
│ │ ├── clock_toggle.c
│ │ ├── clock_toggle.h
│ │ ├── common.mk
│ │ ├── config.c
│ │ ├── context_restore.c
│ │ ├── context_restore.h
│ │ ├── intr.c
│ │ ├── module.tmpl
│ │ ├── omap4430spi.c
│ │ ├── omap4430spi.h
│ │ ├── pinfo.mk
│ │ ├── project.xml
│ │ ├── reg_map_init.c
│ │ ├── sdma.c
│ │ ├── sdma.h
│ │ ├── spi-omap4430.use
│ │ └── wait.c
hardware/spi/master 资源管理器层
├── hardware
│ ├── spi
│ │ ├── Makefile
│ │ ├── master
│ │ │ ├── Makefile
│ │ │ ├── _spi_close_ocb.c
│ │ │ ├── _spi_create_instance.c
│ │ │ ├── _spi_devctl.c
│ │ │ ├── _spi_devlock.c
│ │ │ ├── _spi_dlload.c
│ │ │ ├── _spi_init_iofunc.c
│ │ │ ├── _spi_iomsg.c
│ │ │ ├── _spi_iomsg_cmdread.c
│ │ │ ├── _spi_iomsg_dmaxchange.c
│ │ │ ├── _spi_iomsg_read.c
│ │ │ ├── _spi_iomsg_write.c
│ │ │ ├── _spi_iomsg_xchange.c
│ │ │ ├── _spi_main.c
│ │ │ ├── _spi_ocb.c
│ │ │ ├── _spi_read.c
│ │ │ ├── _spi_slogf.c
│ │ │ ├── _spi_write.c
│ │ │ ├── arm
│ │ │ ├── common.mk
│ │ │ ├── module.tmpl
│ │ │ ├── project.xml
│ │ │ └── proto.h
│ │ └── omap4430
硬件管理接口
这是实现 SPI 主设备特定于硬件的底层功能的代码的接口。spi_funcs_t 结构是一个指向函数的指针表,您可以为特定于硬件的底层模块提供这些函数。 高级应用层代码调用这些函数。
typedef struct {
size_t size; /* size of this structure */
void* (*init)( void *hdl, char *options );
void (*fini)( void *hdl );
int (*drvinfo)( void *hdl, spi_drvinfo_t *info );
int (*devinfo)( void *hdl, uint32_t device, spi_devinfo_t *info );
int (*setcfg)( void *hdl, uint16_t device, spi_cfg_t *cfg );
void* (*xfer)( void *hdl, uint32_t device, uint8_t *buf, int *len );
int (*dma_xfer)( void *hdl, uint32_t device, spi_dma_paddr_t *paddr, int len );
} spi_funcs_t;
底层模块中必须有一个函数表目录,它必须命名为spi_drv_entry。 应用代码或者资源管理器代码查找此符号名称以查找底层模块的函数表。
底层模块句柄结构
SPIDEV 结构是底层模块必须返回给高层代码的句柄。 您可以扩展结构,但 SPIDEV 必须位于顶部。 当高层代码调用底层函数时,此句柄也会传递给底层驱动程序。
typedef struct _spidev_entry {
iofunc_attr_t attr;
void *hdl; /* Pointer to high-level handle */
void *lock; /* Pointer to lock list */
} SPIDEV;
init函数
init函数初始化主接口。该函数的原型是:
void *init( void *hdl, char *options );
/*
* Parameters:
* (in) hdl Handle returned from init() init函数返回的句柄;
* (in) options A pointer to the command-line arguments for the low-level module 底层模块命令行
QNX SPI驱动解析

本文深入剖析QNX系统的SPI驱动框架及其实现细节,以Texas Instruments DRA71x Jacinto6 Cortex A15处理器为例,详细介绍SPI驱动的目录结构、关键函数与资源管理器设计。
最低0.47元/天 解锁文章
1434

被折叠的 条评论
为什么被折叠?



