在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

SPI通用接口層介紹

麥辣雞腿堡 ? 來(lái)源:嵌入式Linux系統(tǒng)開(kāi)發(fā) ? 作者:嵌入式Linux系統(tǒng)開(kāi) ? 2023-07-25 10:52 ? 次閱讀

SPI 通用接口層

  1. SPI 通用接口層把具體的 SPI 設(shè)備的協(xié)議驅(qū)動(dòng)和 SPI 控制器驅(qū)動(dòng)連接在一起。
  2. 負(fù)責(zé) SPI 系統(tǒng)與 Linux 設(shè)備模型相關(guān)的初始化工作。
  3. 為協(xié)議驅(qū)動(dòng)和控制器驅(qū)動(dòng)提供一系列的標(biāo)準(zhǔn)接口 API 及其數(shù)據(jù)結(jié)構(gòu)。
  4. SPI 設(shè)備、SPI 協(xié)議驅(qū)動(dòng)、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é)點(diǎn)
 status = bus_register(&spi_bus_type);
 if (status < 0)
  goto err1;

  //創(chuàng)建 /sys/class/spi_master 節(jié)點(diǎn)
 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é)點(diǎn)和 /sys/class/spi_master 節(jié)點(diǎn)。

重要數(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

接下來(lái)詳細(xì)解析結(jié)構(gòu)體和API,只講解重點(diǎn)部分,完整解析請(qǐng)參考官方文檔

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

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

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

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

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

  //此 spi_master 編號(hào)
 s16   bus_num;

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

  //dma 地址對(duì)齊
 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;

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

  //傳輸數(shù)據(jù)
 int   (*transfer)(struct spi_device *spi,
     struct spi_message *mesg);
  // 設(shè)備 release 時(shí)的清除工作
 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;//序列化傳輸時(shí)的線程 worker
 struct task_struct *kworker_task;//序列化傳輸?shù)木€程
 struct kthread_work pump_messages;//序列化傳輸時(shí)的處理函數(shù)
 spinlock_t  queue_lock;//序列化傳輸時(shí)的queue_lock
 struct list_head queue;//序列化傳輸時(shí)的 msg 隊(duì)列頭
 struct spi_message *cur_msg;//序列化傳輸時(shí)當(dāng)前的 msg
 bool   idling;
 bool   busy;//序列化傳輸時(shí)線程是否處于busy狀態(tài)
 bool   running;//序列化傳輸時(shí)線程是否在運(yùn)行
 bool   rt;//是否實(shí)時(shí)傳輸
  ......

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

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

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

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

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

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

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

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 時(shí)的回調(diào)函數(shù)
 void   (*shutdown)(struct spi_device *spi);
 struct device_driver driver;
};

spi_board_info:描述一個(gè) spi 從機(jī)設(shè)備板級(jí)信息,無(wú)設(shè)備樹(shù)時(shí)使用

struct spi_board_info {
  //設(shè)備名稱
 char  modalias[SPI_NAME_SIZE];
 const void *platform_data;//設(shè)備的平臺(tái)數(shù)據(jù)
 void  *controller_data;//設(shè)備的控制器數(shù)據(jù)
 int  irq;//設(shè)備的中斷號(hào)
 u32  max_speed_hz;//設(shè)備支持的最大速率
 u16  bus_num;//設(shè)備連接的 spi 總線編號(hào)
 u16  chip_select;//設(shè)備連接的 CS 信號(hào)編號(hào)
 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ā)送和接收的長(zhǎng)度

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

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

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

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

struct spi_message {
  //掛載在此 msg 上的 transfer 鏈表頭
 struct list_head transfers;
  //此 msg 需要通信的 spi 從機(jī)設(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 實(shí)際成功發(fā)送的字節(jié)數(shù)
 int   status;//此 msg 的發(fā)送狀態(tài),0:成功,負(fù)數(shù),失敗

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

    關(guān)注

    17

    文章

    1742

    瀏覽量

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

    關(guān)注

    0

    文章

    2

    瀏覽量

    1023
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    SPI協(xié)議及固件庫(kù)

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

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

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

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

    本文根據(jù)SPI 同步串行接口的通信協(xié)議,介紹了在CPLD 中利用VHDL 語(yǔ)言實(shí)現(xiàn)PC/104 總線擴(kuò)展SPI 接口的設(shè)計(jì)原理和編程思想。
    發(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 可以作為主、從器件工作,并可在同一總線上支持多個(gè)主、從器件。SPI 主要使用3 個(gè)信號(hào)。(1)主輸出、從
    發(fā)表于 11-24 08:41 ?4922次閱讀
    <b class='flag-5'>SPI</b><b class='flag-5'>接口</b>總線<b class='flag-5'>介紹</b>

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

    SPI 串行總線是一種常用的標(biāo)準(zhǔn)接口,其使用簡(jiǎn)單方便而且占用系統(tǒng)資源少,應(yīng)用相當(dāng)廣泛。本文將介紹一種新的通用SPI 總線的FPGA 實(shí)現(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è)計(jì)與實(shí)現(xiàn)

    Firefly-RK328-SPI接口介紹

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

    Firefly-RK3128--SPI接口介紹

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

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

    SPI接口簡(jiǎn)介

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

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

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

    SPI接口介紹

    電子發(fā)燒友網(wǎng)站提供《SPI接口介紹.pdf》資料免費(fèi)下載
    發(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接口一樣是非常常見(jiàn)的開(kāi)發(fā)板接口,但與IIC相比,SPI設(shè)計(jì)了一種二進(jìn)制流的交互方式,擁有更快的傳輸速度,它可以在任何兩個(gè)嵌入式設(shè)備之間交換消息,ELF1開(kāi)發(fā)板也是通過(guò)
    的頭像 發(fā)表于 12-06 15:49 ?1634次閱讀
    <b class='flag-5'>SPI</b><b class='flag-5'>接口</b>的相關(guān)<b class='flag-5'>介紹</b>
    主站蜘蛛池模板: 国产美女在线精品免费观看 | 国产一区二区三区美女在线观看 | 正在播放淫亚洲 | 在线天堂中文字幕 | 91寡妇天天综合久久影院 | 国产黄视频在线观看 | 呦交小u女国产秘密入口 | 欧洲妇女成人淫片aaa视频 | 免费看黄视频网站 | 在线免费观看h视频 | 天天做天天爱天天操 | 成片一卡三卡四卡免费网站 | 欧美一级别 | 中文字幕亚洲色图 | 可以免费看的黄色片 | 一级特黄毛片 | 视频 在线| 色婷婷综合久久久久中文一区二区 | 亚洲国产成人久久午夜 | 色天使色护士 | 中文在线免费看影视 | 人人草人人插 | 久久久久久国产精品免费 | 开心激情五月婷婷 | 国产黄色在线视频 | 欧美影院一区 | 日本免费大黄在线观看 | 日日躁夜夜躁狠狠天天 | 国产一级在线观看 | 999久久精品国产 | 亚洲国产成人精彩精品 | 777777777妇女亚洲 | 免费黄色三级网站 | 稀缺资源呦视频在线网站 | 特级毛片a级毛免费播放 | 国产亚洲欧美日韩俺去了 | 午夜寂寞影院视频观看 | 狠狠色婷婷丁香综合久久韩国 | 欧美黄色片在线 | 欧美成人看片一区二区三区 | 性夜影院爽黄a爽免费看网站 |