QNX Neutrino SPI驱动框架与代码分析

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

本文主要描述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 底层模块命令行
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值