博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SylixOS SPI 总线框架浅析
阅读量:6281 次
发布时间:2019-06-22

本文共 4879 字,大约阅读时间需要 16 分钟。

修订历史

版本 日期 原因
V1.00 2018/8/18 创建文档

目 录

1 SPI总线关键结构体 1
1.1 总线传输控制消息块 1
1.2 SPI总线适配器 2
1.3 SPI设备 3
2 SPI各个结构体之间的联系 3
2.1 总线链表 3
2.2 总线与设备 3
3 参考资料 4

1 SPI总线关键结构体

1.1 总线传输控制消息块
传输控制消息包括操作单位bits数、传输控制参数(时钟极性、相位和字节序等配置)、发送和接收缓冲区及其长度、传输结束的回调函数。如程序清单 1.1所示。
程序清单 1.1

typedef struct lw_spi_message {    UINT16                   SPIMSG_usBitsPerOp;                        /*  操作单位bits数              */    UINT16                   SPIMSG_usFlag;                             /*  传输控制参数                */#define LW_SPI_M_CPOL_0      0x0000                                     /*  CPOL 配置                   */#define LW_SPI_M_CPOL_1      0x0001#define LW_SPI_M_CPHA_0      0x0000                                     /*  CPHA 配置                   */#define LW_SPI_M_CPHA_1      0x0002#define LW_SPI_M_CPOL_EN     0x0004                                     /*  是否设置新的 CPOL 配置      */                                                                        /*  否则 CPOL 配置与上次传输相同*/#define LW_SPI_M_CPHA_EN     0x0008                                     /*  是否设置新的 CPHA 配置      */                                                                        /*  否则 CPHA 配置与上次传输相同*//*********************************************************************************************************  LW_SPI_M_WRBUF_FIX, LW_SPI_M_RDBUF_FIX 主要用于半双工的 SPI 操作 (多数从机器件都是这种操作模式).  1: 当 LW_SPI_M_WRBUF_FIX 有效时, 表明本次操作是读操作, 每次发送的数据都是 SPIMSG_pucWrBuffer 的第一个字     符, 而读到的数据将依次存放在 SPIMSG_pucRdBuffer 中.     所以: 读缓冲的大小必须可以存放 SPIMSG_usLen 个字符, 而写缓冲的大小可以仅是 1 个字符长度.  2: 当 LW_SPI_M_RDBUF_FIX 有效时, 表明本次操作是写操作, 对读到什么数据并不感兴趣, 所以每次读到的数据都放     在 SPIMSG_pucRdBuffer 的第一个字符处.     所以: 写缓冲的大小必须可以存放 SPIMSG_usLen 个字符, 而读缓冲的大小可以仅是 1 个字符长度.*********************************************************************************************************/#define LW_SPI_M_WRBUF_FIX   0x0010                                     /*  发送缓冲区仅发送第一个字符  */                                                                        /*  永远发送第一个字符          */#define LW_SPI_M_RDBUF_FIX   0x0020                                     /*  接收缓冲区仅接收第一个字符  */                                                                        /*  接收的数据永远发在第一个接收*/                                                                        /*  缓冲指针的位置              */#define LW_SPI_M_MSB         0x0040                                     /*  从高位到低位                */#define LW_SPI_M_LSB         0x0080                                     /*  从低位到高位                */    UINT32                   SPIMSG_uiLen;                              /*  长度(缓冲区大小)            */                                                                        /*  长度为0, 只设置传输控制参数 */    UINT8                   *SPIMSG_pucWrBuffer;                        /*  发送缓冲区                  */    UINT8                   *SPIMSG_pucRdBuffer;                        /*  接收缓冲区                  */    VOIDFUNCPTR              SPIMSG_pfuncComplete;                      /*  传输结束后的回调函数        */    PVOID                    SPIMSG_pvContext;                          /*  回调函数参数                */} LW_SPI_MESSAGE;

1.2 SPI总线适配器

总线设配器包括总线节点、总线适配器操作函数、总线操作锁和设备链表。如程序清单 1.2所示。总线节点是用于管理所有SPI总线的链表节点;总线适配器操作函数包括总线传输函数和总线控制函数;总线操作锁用于实现总线互斥操作;设备链表是由所有关联当前SPI适配器的设备组成的链表。
程序清单 1.2

typedef struct lw_spi_adapter {    LW_BUS_ADAPTER           SPIADAPTER_pbusadapter;     /*  总线节点 */    struct lw_spi_funcs     *SPIADAPTER_pspifunc;        /* 总线适配器操作函数 */            LW_OBJECT_HANDLE         SPIADAPTER_hBusLock;         /*  总线操作锁*/    LW_LIST_LINE_HEADER      SPIADAPTER_plineDevHeader;      /*  设备链表  */} LW_SPI_ADAPTER;typedef struct lw_spi_funcs {    INT              (*SPIFUNC_pfuncMasterXfer)(PLW_SPI_ADAPTER   pspiadapter,                                                      PLW_SPI_MESSAGE   pspimsg,                                                      INT               iNum);                                                   /*  适配器数据传输              */    INT              (*SPIFUNC_pfuncMasterCtl)(PLW_SPI_ADAPTER   pspiadapter,                                                     INT               iCmd,                                                     LONG              lArg);                                                      /*  适配器控制                  */} LW_SPI_FUNCS;

1.3 SPI设备

SPI设备结构成员包括挂载的适配器指针、设备挂载链、设备使用计数、设备名称。如程序清单 1.3所示。
程序清单 1.3

typedef struct lw_spi_device {    PLW_SPI_ADAPTER              SPIDEV_pspiadapter;   /*  挂载的适配器 */    LW_LIST_LINE                 SPIDEV_lineManage;     /*  设备挂载链   */    atomic_t                     SPIDEV_atomicUsageCnt; /*  设备使用计数 */    CHAR                         SPIDEV_cName[LW_CFG_OBJECT_NAME_SIZE]; /*  设备的名称                  */} LW_SPI_DEVICE;

2 SPI各个结构体之间的联系

2.1 总线链表
所有SPI总线适配器都是链接在以_G_plineBusAdapterHeader为头节点的链表上。如图 2.1所示。
SylixOS SPI 总线框架浅析
图 2.1 SPI总线链表
2.2 总线与设备
总线与设备的逻辑关系如图 2.2所示。
SylixOS SPI 总线框架浅析
图 2.2 总线与设备关系
3 参考资料
《SylixOS_driver_usermanual》

转载于:https://blog.51cto.com/12142768/2170557

你可能感兴趣的文章
用phpmyadimn来连接管理多个数据库
查看>>
解决RedHat 5 yum安装错误
查看>>
【jc2-1】 网络层IP编址
查看>>
诺基亚Lumia 800生产背后的故事——萨罗工厂[多图]
查看>>
AndroidUI优化工具——HierarchyViewer
查看>>
【一天一个shell命令】好管家--资源管理-top
查看>>
使用dashboard操作Openstack
查看>>
2012年在杭州承接的第一个软件项目经验浅谈 -- 门户网站数据库、ASP.NET程序性能改进...
查看>>
Windows Server 2012 Hyper-V故障转移集群虚拟机亲和性策略
查看>>
微服务专题:服务注册与发现之一Consul快速上手
查看>>
String、StringBuffer与StringBuilder之间区别
查看>>
用 Python 实现一个大数据搜索引擎
查看>>
asp页面
查看>>
oracle表空间表分区详解及oracle表分区查询使用方法(转+整理)
查看>>
【整理学习HDFS】Hadoop Distributed File System 一个分布式文件系统
查看>>
外部系统调用规则引擎接口
查看>>
SSH通过密钥对验证方式进行远程访问及控制
查看>>
Python学习——编程语言介绍
查看>>
深入浅出oracle锁---原理篇
查看>>
SentOS Linux下安装MongoDB
查看>>