rtt设备驱动框架学习-spi总线和设备

1.spi总线
spi总线分为硬件spi总线和软件模拟spi总线。
按照面向对象的思想,要抽象出硬件spi总线和软件spi总线的相同点和不同点。相同点就变成了spi总线基类,不同点就是各个子类的私有特性。

rtt就是这么干的,共同点是什么?方法——都得有spi配置方法和数据传输方法等,于是抽象出了rt_spi_bus类。
struct rt_spi_bus
{ struct rt_device parent; rt_uint8_t mode; const struct rt_spi_ops *ops; struct rt_mutex lock; struct rt_spi_device *owner;};

对于硬件spi子类,则负责实现rt_spi_bus的ops操作方法。

对于软件spi,差异点就是要用gpio模拟硬件spi的4线或3线通信,那么软件gpio除了实现上面共同点ops操作方法外,还得抽象软件spi通信。
于是抽象出spi软总线基类——rt_spi_bit_obj。
struct rt_spi_bit_obj
{ struct rt_spi_bus bus; struct rt_spi_bit_ops *ops; struct rt_spi_configuration config;};

因为有共同点所以得继承rt_spi_bus基类,它的差异点抽象出了rt_spi_bit_ops操作方法实现gpio模拟spi通信。

struct rt_spi_bit_ops
{ void data; / private data for lowlevel routines */ void (*const tog_sclk)(void *data); void (*const set_sclk)(void *data, rt_int32_t state); void (*const set_mosi)(void *data, rt_int32_t state); void (*const set_miso)(void *data, rt_int32_t state); rt_int32_t (*const get_sclk)(void *data); rt_int32_t (*const get_mosi)(void *data); rt_int32_t (*const get_miso)(void *data); void (*const dir_mosi)(void *data, rt_int32_t state); void (*const dir_miso)(void *data, rt_int32_t state); void (const udelay)(rt_uint32_t us); rt_uint32_t delay_us; / sclk, mosi and miso line delay */};

这个抽象出的方法作为软件spi总线类rt_spi_bit_obj的成员,为何还要抽象出来?因为下面还有个子类——具体硬件厂家的软件spi总线——因为各个硬件操作gpio具体实现是不同的,但是这些方法是都一样,所以抽象出来——跨硬件平台,这个框架才叫框架,这个框架才有意义。
接着就是硬件spi软总线层次了,各个厂家bsp创建各自的软spi总线子类对象,实现软件spi基类的ops方法。

2.spi设备
上面spi总线基类里有个“struct rt_spi_device *owner”,这是spi设备对象指针,为何在spi总线里加个spi设备的指针成员,且还叫owner(字面意思:spi总线持有者或霸占者或拥有者)?
用面向对象的思想来分析下,spi总线和spi设备是啥关系?可以搜下面向对象思想中对象关系有哪些,有包含(拥有)关系,聚合关系,关联关系等等。而spi总线和spi设备就是关联关系吧。谁关联谁?我觉得是互相关联吧。你看,它们的关系特点:一个spi总线上可以挂载很多个spi设备,同一时刻,一个spi总线只能和一个spi设备通信,这样看来同一个spi总线上的spi设备是分时共享这个spi总线的,spi设备之间是有竞争关系的,spi总线就相当于共享资源,同一时刻只能有一个spi设备霸占。所以上面抽象出的spi总线基类里有一个owner标志,表示当前是哪个spi设备在使用/霸占/持有spi总线。
那么同样的,spi设备里肯定也有一个指针指向它挂载到那个spi总线上了——因为它们是关联关系。
于是看下rtt抽象出的spi设备类rt_spi_device定义:
struct rt_spi_device
{ struct rt_device parent; struct rt_spi_bus *bus; struct rt_spi_configuration config; rt_base_t cs_pin; void *user_data;};

果然不出所料,有个spi总线基类指针来表明该spi设备挂载到哪个spi总线上了。

相关推荐

  1. rtt设备驱动框架学习-spi线设备

    2024-02-06 23:54:04       31 阅读
  2. RTT设备驱动框架学习(GPIO)

    2024-02-06 23:54:04       13 阅读
  3. RTT设备驱动框架学习(UART)

    2024-02-06 23:54:04       16 阅读
  4. rtt设备io框架面向对象学习-硬件rtc设备

    2024-02-06 23:54:04       36 阅读
  5. rtt设备io框架面向对象学习-软件模拟rtc设备

    2024-02-06 23:54:04       37 阅读
  6. rtt设备io框架面向对象学习-看门狗设备

    2024-02-06 23:54:04       35 阅读
  7. rtt设备io框架面向对象学习-adc设备

    2024-02-06 23:54:04       32 阅读
  8. rtt设备io框架面向对象学习-输入捕捉设备

    2024-02-06 23:54:04       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-06 23:54:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-06 23:54:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-06 23:54:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-06 23:54:04       18 阅读

热门阅读

  1. TCP和UDP相关问题(重点)(2)

    2024-02-06 23:54:04       34 阅读
  2. 配合后端-开发工具(在线)

    2024-02-06 23:54:04       37 阅读
  3. pnpm + vite 从外网迁移到内网环境开发

    2024-02-06 23:54:04       42 阅读
  4. Git学习笔记-- amend 详解

    2024-02-06 23:54:04       32 阅读
  5. 计算机网络相关题目及答案(第一章)

    2024-02-06 23:54:04       32 阅读
  6. 计算机网络相关题目及答案(第二章)

    2024-02-06 23:54:04       30 阅读
  7. 浅谈null和undefined的异同

    2024-02-06 23:54:04       35 阅读
  8. 非springboot 使用aop 切面

    2024-02-06 23:54:04       35 阅读
  9. C语言——S/顺序表专题

    2024-02-06 23:54:04       33 阅读
  10. SpringMVC-请求

    2024-02-06 23:54:04       33 阅读