zoukankan      html  css  js  c++  java
  • spi设备描述过程

    一、spi通信 中控制器驱动及spi设备、spi设备驱动的关系入下图:

    控制器驱动以及设备全志已经完成,在/driver/spi/spi--sunxi.c  中,打开源码文件可以看到spi控制器属于平台总线,匹配成功会产生一个控制器对象spi_master,当spi_master注册时会和spi_board_info进行结合,生成spi_device对象。

    我们需要做的就是描述一个spi设备的spi_board_info 类型的对象。

    首先我们要先了解用到的结构体:

    描述spi_device 对象的结构体:

     1 struct spi_device {
     2         struct device           dev; //基于device成员扩展, 在/sys/bus/spi/devie目录有相应的子目录(名为spi%d.%d)
     3         struct spi_master       *master; //spi控制器对象的地址
     4         u32                     max_speed_hz; //设备工作时钟最大多少HZ
     5         u8                      chip_select;   
     6         u8                      mode;    
     7 #define SPI_CPHA        0x01                    /* clock phase */
     8 #define SPI_CPOL        0x02                    /* clock polarity */
     9 #define SPI_MODE_0      (0|0)                   /* (original MicroWire) */
    10 #define SPI_MODE_1      (0|SPI_CPHA)
    11 #define SPI_MODE_2      (SPI_CPOL|0)
    12 #define SPI_MODE_3      (SPI_CPOL|SPI_CPHA)
    13 #define SPI_CS_HIGH     0x04                    /* chipselect active high? */
    14 #define SPI_LSB_FIRST   0x08                    /* per-word bits-on-wire */
    15 #define SPI_3WIRE       0x10                    /* SI/SO signals shared */
    16 #define SPI_LOOP        0x20                    /* loopback mode */
    17 #define SPI_NO_CS       0x40                    /* 1 dev/bus, no chipselect */
    18 #define SPI_READY       0x80                    /* slave pulls low to pause */
    19         u8                      bits_per_word; //传输的数据以多少位为单位
    20         int                     irq;    //中断号
    21         void                    *controller_state;
    22         void                    *controller_data; //给控制器的驱动使用,不同的控制器需要的类型不同,
                               可以进入/driver/spi/spi_sunxi.c查看controller_data的类型
    23 char modalias[SPI_NAME_SIZE]; //spi设备的名字 24 };
    // spi设备驱动类型
    struct spi_driver {
        const struct spi_device_id *id_table;
        int         (*probe)(struct spi_device *spi);
        int         (*remove)(struct spi_device *spi);
        void            (*shutdown)(struct spi_device *spi);
        int         (*suspend)(struct spi_device *spi, pm_message_t mesg);
        int         (*resume)(struct spi_device *spi);
        struct device_driver    driver; //基于device_driver扩展, 驱动模型
    };
    
    
    extern int spi_register_driver(struct spi_driver *sdrv);
    static inline void spi_unregister_driver(struct spi_driver *sdrv);
     1 描述spi设备的结构体
     2 struct spi_board_info spi_infos[] = {
     3     {
     4         .modalias = "mcp2515",  //设备名
     5         .platform_data = NULL,   //根据spi驱动决定是否用了平台数据。dev.platform_data    
     6         .controller_data = &sunxi_data,//需查控制器的驱动代码,可得知需要提供struct sunxi_spi_config类型数据. 注意不同的同台,需要数据类型也会不同
     7 
     8         .irq = gpio_to_irq(GPIOA(10)),
     9         .max_speed_hz = 2000000, //2MHz
    10         .bus_num = 0, // 接编号为0的控制器
    11         .mode = SPI_MODE_0,//通信模式
    12     },
    13
    14 };

      注:.controller_data 是和控制器驱动数据相关的,需要产看相应的控制器,如全志的spi控制器驱动代码在
      /drivers/spi/spi-sunxi.c.通过查看类新如下图。

    结构体类型如下:

  • 相关阅读:
    聊聊什么是慢查、如何监控?如何排查?
    navicat连接sqlserver数据库提示:未发现数据源名并且未指定默认驱动程序
    定位元素的父(parent::)、兄弟(following-sibling::、preceding-sibling::)节点
    java方法返回值前面的泛型是什么?
    java8Lambda的环绕执行模式
    try语法糖
    php-fpm优化内存占用大
    Gitlab安装
    第2章 python入门
    LAMP源码安装
  • 原文地址:https://www.cnblogs.com/edan/p/9265099.html
Copyright © 2011-2022 走看看