chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(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 設備的協(xié)議驅(qū)動和 SPI 控制器驅(qū)動連接在一起。
  2. 負責 SPI 系統(tǒng)與 Linux 設備模型相關(guān)的初始化工作。
  3. 為協(xié)議驅(qū)動和控制器驅(qū)動提供一系列的標準接口 API 及其數(shù)據(jù)結(jié)構(gòu)。
  4. SPI 設備、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 主機設備

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

  //此 spi_master 設備在全局 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ù)
 int   (*setup)(struct spi_device *spi);

  //傳輸數(shù)據(jù)
 int   (*transfer)(struct spi_device *spi,
     struct spi_message *mesg);
  // 設備 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 從機設備

struct spi_device {
  //Linux驅(qū)動模型中的設備
 struct device  dev;
 struct spi_master *master;//設備所連接的 spi 主機設備
 u32   max_speed_hz;//該設備最大傳輸速率
 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];//設備名稱
  //CS 片選信號對應的 GPIO number
 int   cs_gpio;  /* chip select gpio */

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

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

struct spi_driver {
  //此driver所支持的 spi 設備 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 從機設備板級信息,無設備樹時使用

struct spi_board_info {
  //設備名稱
 char  modalias[SPI_NAME_SIZE];
 const void *platform_data;//設備的平臺數(shù)據(jù)
 void  *controller_data;//設備的控制器數(shù)據(jù)
 int  irq;//設備的中斷號
 u32  max_speed_hz;//設備支持的最大速率
 u16  bus_num;//設備連接的 spi 總線編號
 u16  chip_select;//設備連接的 CS 信號編號
 u16  mode;//設備使用的傳輸 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 對應的 dma 地址
 dma_addr_t rx_dma;//rx_buf 對應的 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 從機設備
 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)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1804

    瀏覽量

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

    關(guān)注

    0

    文章

    2

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    SPI接口硬件設計介紹

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

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

    SPI接口的工作原理

    MAX7456隨屏顯示(OSD)發(fā)生器具有SPI™兼容接口,本應用筆記介紹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 ?5015次閱讀
    <b class='flag-5'>SPI</b><b class='flag-5'>接口</b>總線<b class='flag-5'>介紹</b>

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

    SPI 串行總線是一種常用的標準接口,其使用簡單方便而且占用系統(tǒ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設計與實現(xiàn)

    Firefly-RK328-SPI接口介紹

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

    Firefly-RK3128--SPI接口介紹

    SPI是一種高速的,全雙工,同步串行通信接口,用于連接微控制器、傳感器、存儲設備等,本文以指紋識別模塊為例簡單介紹SPI使用。
    的頭像 發(fā)表于 11-28 16:32 ?3465次閱讀
    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接口簡介

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

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

    和相應的設備進行正確的數(shù)據(jù)交換 向通用接口提供接口,使得上層的協(xié)議驅(qū)動可以通過通用接口
    的頭像 發(fā)表于 07-25 10:58 ?1970次閱讀
    <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設計了一種二進制流的交互方式,擁有更快的傳輸速度,它可以在任何兩個嵌入式設備之間交換消息,ELF1開發(fā)板也是通過
    的頭像 發(fā)表于 12-06 15:49 ?1873次閱讀
    <b class='flag-5'>SPI</b><b class='flag-5'>接口</b>的相關(guān)<b class='flag-5'>介紹</b>