一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SPI通用接口層介紹

麥辣雞腿堡 ? 來源:嵌入式Linux系統(tǒng)開發(fā) ? 作者:嵌入式Linux系統(tǒng)開 ? 2023-07-25 10:52 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

SPI 通用接口層

  1. SPI 通用接口層把具體的 SPI 設(shè)備的協(xié)議驅(qū)動和 SPI 控制器驅(qū)動連接在一起。
  2. 負責 SPI 系統(tǒng)與 Linux 設(shè)備模型相關(guān)的初始化工作。
  3. 為協(xié)議驅(qū)動和控制器驅(qū)動提供一系列的標準接口 API 及其數(shù)據(jù)結(jié)構(gòu)。
  4. SPI 設(shè)備、SPI 協(xié)議驅(qū)動、SPI 控制器的數(shù)據(jù)抽象
  5. 協(xié)助數(shù)據(jù)傳輸而定義的數(shù)據(jù)結(jié)構(gòu)

kernel-4.14/drivers/spi/spi.c

static int __init spi_init(void)
{
 int status;

 buf = kmalloc(SPI_BUFSIZ, GFP_KERNEL);
 if (!buf) {
  status = -ENOMEM;
  goto err0;
 }
        
  // 創(chuàng)建 /sys/bus/spi 節(jié)點
 status = bus_register(&spi_bus_type);
 if (status < 0)
  goto err1;

  //創(chuàng)建 /sys/class/spi_master 節(jié)點
 status = class_register(&spi_master_class);
 if (status < 0)
  goto err2;

 if (IS_ENABLED(CONFIG_SPI_SLAVE)) {
  status = class_register(&spi_slave_class);
  if (status < 0)
   goto err3;
 }
        ......
}

在這里創(chuàng)建了 SPI 總線,創(chuàng)建 /sys/bus/spi 節(jié)點和 /sys/class/spi_master 節(jié)點。

重要數(shù)據(jù)結(jié)構(gòu):

spi_device
spi_driver
spi_board_info
spi_controller/spi_master
spi_transfer
spi_message

重要 API

spi_message_init
spi_message_add_tail
spi_sync
spi_async
spi_write
spi_read

接下來詳細解析結(jié)構(gòu)體和API,只講解重點部分,完整解析請參考官方文檔

https://www.kernel.org/doc/html/v4.14//driver-api/spi.html

只有熟悉每個結(jié)構(gòu)體存儲的是什么東西,才能真正搞懂 SPI 模塊。

spi_master/spi_controller:描述一個 spi 主機設(shè)備

struct spi_master {
  //Linux 驅(qū)動模型中的設(shè)備
 struct device dev;

  //此 spi_master 設(shè)備在全局 spi_master 鏈表中的節(jié)點
 struct list_head list;

  //此 spi_master 編號
 s16   bus_num;

  //此 spi_master 支持的片選信號數(shù)量
 u16   num_chipselect;

  //dma 地址對齊
 u16   dma_alignment;

  //此 spi_master 支持傳輸?shù)?mode
 u16   mode_bits;
 u32   bits_per_word_mask;
 /* limits on transfer speed */
 u32   min_speed_hz;
 u32   max_speed_hz;

 /* other constraints relevant to this driver */
 u16   flags;

 /* lock and mutex for SPI bus locking */
 spinlock_t  bus_lock_spinlock;//總線自旋鎖
 struct mutex  bus_lock_mutex;//總線互斥鎖

  //總線是否處于 lock 狀態(tài)
 bool   bus_lock_flag;

  //準備傳輸,設(shè)置傳輸?shù)膮?shù)
 int   (*setup)(struct spi_device *spi);

  //傳輸數(shù)據(jù)
 int   (*transfer)(struct spi_device *spi,
     struct spi_message *mesg);
  // 設(shè)備 release 時的清除工作
 void   (*cleanup)(struct spi_device *spi);

 bool   (*can_dma)(struct spi_master *master,
        struct spi_device *spi,
        struct spi_transfer *xfer);

 bool   queued;//是否采用系統(tǒng)的序列化傳輸
 struct kthread_worker kworker;//序列化傳輸時的線程 worker
 struct task_struct *kworker_task;//序列化傳輸?shù)木€程
 struct kthread_work pump_messages;//序列化傳輸時的處理函數(shù)
 spinlock_t  queue_lock;//序列化傳輸時的queue_lock
 struct list_head queue;//序列化傳輸時的 msg 隊列頭
 struct spi_message *cur_msg;//序列化傳輸時當前的 msg
 bool   idling;
 bool   busy;//序列化傳輸時線程是否處于busy狀態(tài)
 bool   running;//序列化傳輸時線程是否在運行
 bool   rt;//是否實時傳輸
  ......

 int (*prepare_transfer_hardware)(struct spi_master *master);

  //一個 msg 的傳輸實現(xiàn)
 int (*transfer_one_message)(struct spi_master *master,
        struct spi_message *mesg);
  ......

 /* gpio chip select */
 int   *cs_gpios;
  ......
};

spi_device:描述一個 spi 從機設(shè)備

struct spi_device {
  //Linux驅(qū)動模型中的設(shè)備
 struct device  dev;
 struct spi_master *master;//設(shè)備所連接的 spi 主機設(shè)備
 u32   max_speed_hz;//該設(shè)備最大傳輸速率
 u8   chip_select;//CS片選信號編號
 u8   bits_per_word;//每次傳輸長度
 u16   mode;//傳輸模式
 ......
 int   irq;//軟件中斷號
 void   *controller_state;//控制器狀態(tài)
 void   *controller_data;//控制參數(shù)
 char   modalias[SPI_NAME_SIZE];//設(shè)備名稱
  //CS 片選信號對應(yīng)的 GPIO number
 int   cs_gpio;  /* chip select gpio */

 /* the statistics */
 struct spi_statistics statistics;
};

spi_driver:描述一個 spi 設(shè)備驅(qū)動

struct spi_driver {
  //此driver所支持的 spi 設(shè)備 list
 const struct spi_device_id *id_table;
 int   (*probe)(struct spi_device *spi);
 int   (*remove)(struct spi_device *spi);
  //系統(tǒng) shutdown 時的回調(diào)函數(shù)
 void   (*shutdown)(struct spi_device *spi);
 struct device_driver driver;
};

spi_board_info:描述一個 spi 從機設(shè)備板級信息,無設(shè)備樹時使用

struct spi_board_info {
  //設(shè)備名稱
 char  modalias[SPI_NAME_SIZE];
 const void *platform_data;//設(shè)備的平臺數(shù)據(jù)
 void  *controller_data;//設(shè)備的控制器數(shù)據(jù)
 int  irq;//設(shè)備的中斷號
 u32  max_speed_hz;//設(shè)備支持的最大速率
 u16  bus_num;//設(shè)備連接的 spi 總線編號
 u16  chip_select;//設(shè)備連接的 CS 信號編號
 u16  mode;//設(shè)備使用的傳輸 mode
};

spi_transfer:描述 spi 傳輸?shù)木唧w數(shù)據(jù)

struct spi_transfer {

 const void *tx_buf;//spi_transfer 的發(fā)送 buf
 void  *rx_buf;//spi_transfer 的接收 buf
 unsigned len;//spi_transfer 發(fā)送和接收的長度

 dma_addr_t tx_dma;//tx_buf 對應(yīng)的 dma 地址
 dma_addr_t rx_dma;//rx_buf 對應(yīng)的 dma 地址
 struct sg_table tx_sg;
 struct sg_table rx_sg;

  //spi_transfer傳輸完成后是否要改變 CS 片選信號
 unsigned cs_change:1;
 unsigned tx_nbits:3;
 unsigned rx_nbits:3;
  ......
 u8  bits_per_word;//spi_transfer 中一個 word 占的bits
 u16  delay_usecs;//兩個 spi_transfer 直接的等待延遲
 u32  speed_hz;//spi_transfer 的傳輸速率

 struct list_head transfer_list;//spi_transfer掛載到的 message 節(jié)點
};

spi_message:描述一次 spi 傳輸?shù)男畔?/p>

struct spi_message {
  //掛載在此 msg 上的 transfer 鏈表頭
 struct list_head transfers;
  //此 msg 需要通信的 spi 從機設(shè)備
 struct spi_device *spi;
  //所使用的地址是否是 dma 地址
 unsigned  is_dma_mapped:1;

 //msg 發(fā)送完成后的處理函數(shù)
 void   (*complete)(void *context);
 void   *context;//complete函數(shù)的參數(shù)
 unsigned  frame_length;
 unsigned  actual_length;//此 msg 實際成功發(fā)送的字節(jié)數(shù)
 int   status;//此 msg 的發(fā)送狀態(tài),0:成功,負數(shù),失敗

 struct list_head queue;//此 msg 在所有 msg 中的鏈表節(jié)點
 void   *state;//此 msg 的私有數(shù)據(jù)
};
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1803

    瀏覽量

    95862
  • 接口層
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    1049
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    SPI接口硬件設(shè)計介紹

    SPI(Serial Peripheral interface)串行外圍設(shè)備接口。是微控制器和外圍IC(如傳感器、 ADC、 DAC、移位寄存器、 SRAM等)之間使用最廣泛的接口之一。SPI
    發(fā)表于 09-15 15:45 ?2880次閱讀
    <b class='flag-5'>SPI</b><b class='flag-5'>接口</b>硬件設(shè)計<b class='flag-5'>介紹</b>

    SPI協(xié)議及固件庫

    》[正點原子]STM32F4開發(fā)指南-庫函數(shù)版本_V1.2[ST]《STM32F4xx中文參考手冊》SPI協(xié)議及總線協(xié)議介紹W25Q128產(chǎn)品數(shù)據(jù)手冊SPI協(xié)議介紹
    發(fā)表于 08-20 08:00

    SPI協(xié)議的作用介紹

    目錄SPI協(xié)議簡介SPI物理SPI協(xié)議SPI協(xié)議簡介SP
    發(fā)表于 02-17 07:02

    基于PC/104 總線與CPLD 的SPI 接口設(shè)計

    本文根據(jù)SPI 同步串行接口的通信協(xié)議,介紹了在CPLD 中利用VHDL 語言實現(xiàn)PC/104 總線擴展SPI 接口的設(shè)計原理和編程思想。
    發(fā)表于 05-30 09:28 ?41次下載

    SPI接口的工作原理

    MAX7456隨屏顯示(OSD)發(fā)生器具有SPI™兼容接口,本應(yīng)用筆記介紹SPI接口的工作原理,文中還包含在微控制器內(nèi)逐位模擬
    發(fā)表于 07-27 23:24 ?1.5w次閱讀
    <b class='flag-5'>SPI</b><b class='flag-5'>接口</b>的工作原理

    SPI接口總線介紹

    SPI接口總線介紹 SPI 可以作為主、從器件工作,并可在同一總線上支持多個主、從器件。SPI 主要使用3 個信號。(1)主輸出、從
    發(fā)表于 11-24 08:41 ?5014次閱讀
    <b class='flag-5'>SPI</b><b class='flag-5'>接口</b>總線<b class='flag-5'>介紹</b>

    一種通用SPI接口的FPGA設(shè)計與實現(xiàn)

    SPI 串行總線是一種常用的標準接口,其使用簡單方便而且占用系統(tǒng)資源少,應(yīng)用相當廣泛。本文將介紹一種新的通用SPI 總線的FPGA 實現(xiàn)方
    發(fā)表于 09-09 11:58 ?67次下載
    一種<b class='flag-5'>通用</b><b class='flag-5'>SPI</b><b class='flag-5'>接口</b>的FPGA設(shè)計與實現(xiàn)

    Firefly-RK328-SPI接口介紹

    SPI是一種高速的,全雙工,同步串行通信接口,用于連接微控制器、傳感器、存儲設(shè)備等,本文以指紋識別模塊為例簡單介紹SPI使用。
    的頭像 發(fā)表于 11-25 10:26 ?2267次閱讀
    Firefly-RK328-<b class='flag-5'>SPI</b><b class='flag-5'>接口</b><b class='flag-5'>介紹</b>

    Firefly-RK3128--SPI接口介紹

    SPI是一種高速的,全雙工,同步串行通信接口,用于連接微控制器、傳感器、存儲設(shè)備等,本文以指紋識別模塊為例簡單介紹SPI使用。
    的頭像 發(fā)表于 11-28 16:32 ?3448次閱讀
    Firefly-RK3128--<b class='flag-5'>SPI</b><b class='flag-5'>接口</b><b class='flag-5'>介紹</b>

    STM32的SPI接口、cubeMX軟件配置SPI接口和分析SPI相關(guān)代碼

    本文主要介紹STM32的SPI接口、cubeMX軟件配置SPI接口和分析SPI相關(guān)代碼。 STM
    的頭像 發(fā)表于 09-24 14:09 ?1.7w次閱讀
    STM32的<b class='flag-5'>SPI</b><b class='flag-5'>接口</b>、cubeMX軟件配置<b class='flag-5'>SPI</b><b class='flag-5'>接口</b>和分析<b class='flag-5'>SPI</b>相關(guān)代碼

    STM32CubeMX-HAL庫的SPI接口使用

    本文主要介紹STM32的SPI接口、cubeMX軟件配置SPI接口和分析SPI相關(guān)代碼。
    發(fā)表于 02-08 15:27 ?10次下載
    STM32CubeMX-HAL庫的<b class='flag-5'>SPI</b><b class='flag-5'>接口</b>使用

    SPI接口簡介

    串行外設(shè)接口(SPI)是微控制器和外圍IC(如傳感器、ADC、DAC、移位寄存器、SRAM等)之間使用較廣泛的接口之一。本文先簡要說明SPI接口
    的頭像 發(fā)表于 06-17 09:13 ?7724次閱讀
    <b class='flag-5'>SPI</b><b class='flag-5'>接口</b>簡介

    SPI控制器驅(qū)動功能介紹

    和相應(yīng)的設(shè)備進行正確的數(shù)據(jù)交換 向通用接口提供接口,使得上層的協(xié)議驅(qū)動可以通過通用接口
    的頭像 發(fā)表于 07-25 10:58 ?1952次閱讀
    <b class='flag-5'>SPI</b>控制器驅(qū)動<b class='flag-5'>層</b>功能<b class='flag-5'>介紹</b>

    SPI接口介紹

    電子發(fā)燒友網(wǎng)站提供《SPI接口介紹.pdf》資料免費下載
    發(fā)表于 10-13 10:49 ?0次下載
    <b class='flag-5'>SPI</b><b class='flag-5'>接口</b><b class='flag-5'>介紹</b>

    SPI接口的相關(guān)介紹

    SPI和IIC接口一樣是非常常見的開發(fā)板接口,但與IIC相比,SPI設(shè)計了一種二進制流的交互方式,擁有更快的傳輸速度,它可以在任何兩個嵌入式設(shè)備之間交換消息,ELF1開發(fā)板也是通過
    的頭像 發(fā)表于 12-06 15:49 ?1864次閱讀
    <b class='flag-5'>SPI</b><b class='flag-5'>接口</b>的相關(guān)<b class='flag-5'>介紹</b>