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

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

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

SPI子系統(tǒng):SPI設(shè)備驅(qū)動(dòng)

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

SPI 設(shè)備驅(qū)動(dòng)

【設(shè)備】聲明在設(shè)備樹(shù)中

圖片

圖片

注意:設(shè)備的聲明,slave device node 應(yīng)該包含在你所要掛載的 &spi node 下,將 device 綁定在 master 上。然后通過(guò) pinctrl 方式指定 GPIO,并在驅(qū)動(dòng)中操作 pinctrl 句柄。

【驅(qū)動(dòng)】demo

Linux 內(nèi)核使用 spi_driver 結(jié)構(gòu)體來(lái)表示 spi 設(shè)備驅(qū)動(dòng),我們?cè)诰帉?xiě) SPI 設(shè)備驅(qū)動(dòng)的時(shí)候需要實(shí)現(xiàn) spi_driver。spi_driver 結(jié)構(gòu)體定義在 include/linux/spi/spi.h 文件中。

spi_register_driver:注冊(cè) spi_driver
spi_unregister_driver:銷(xiāo)掉 spi_driver
/* probe 函數(shù) */
static int xxx_probe(struct spi_device *spi)
{

 /* 具體函數(shù)內(nèi)容 */
 return 0;
}

/* remove 函數(shù) */
static int xxx_remove(struct spi_device *spi)
{

 /* 具體函數(shù)內(nèi)容 */
 return 0;
}

/* 傳統(tǒng)匹配方式 ID 列表 */
static const struct spi_device_id xxx_id[] = {

 {"xxx", 0},
 {}
};

/* 設(shè)備樹(shù)匹配列表 */
static const struct of_device_id xxx_of_match[] = {

 { .compatible = "xxx" },
 { /* Sentinel */ }
};

/* SPI 驅(qū)動(dòng)結(jié)構(gòu)體 */
static struct spi_driver xxx_driver = {

 .probe = xxx_probe,
 .remove = xxx_remove,
 .driver = {
  .owner = THIS_MODULE,
  .name = "xxx",
  .of_match_table = xxx_of_match,
  },
 .id_table = xxx_id,
};

/* 驅(qū)動(dòng)入口函數(shù) */
static int __init xxx_init(void)
{

 return spi_register_driver(&xxx_driver);
}

/* 驅(qū)動(dòng)出口函數(shù) */
static void __exit xxx_exit(void)
{

 spi_unregister_driver(&xxx_driver);
}

module_init(xxx_init);
module_exit(xxx_exit);

在驅(qū)動(dòng)入口函數(shù)中調(diào)用 spi_register_driver 來(lái)注冊(cè) spi_driver。

在驅(qū)動(dòng)出口函數(shù)中調(diào)用 spi_unregister_driver 來(lái)注銷(xiāo) spi_driver。

spi 讀寫(xiě)數(shù)據(jù)demo

/* SPI 多字節(jié)發(fā)送 */
static int spi_send(struct spi_device *spi, u8 *buf, int len)
{
 int ret;
 struct spi_message m;
 
 struct spi_transfer t = {
  .tx_buf = buf,
  .len = len,
 };
 
 spi_message_init(&m); /* 初始化 spi_message */
 spi_message_add_tail(t, &m);/* 將 spi_transfer 添加到 spi_message 隊(duì)列 */
 ret = spi_sync(spi, &m); /* 同步傳輸 */
 return ret;
}
/* SPI 多字節(jié)接收 */
static int spi_receive(struct spi_device *spi, u8 *buf, int len)
{
 int ret;
 struct spi_message m;
 
 struct spi_transfer t = {
  .rx_buf = buf,
  .len = len,
 };
 
 spi_message_init(&m); /* 初始化 spi_message */
 spi_message_add_tail(t, &m);/* 將 spi_transfer 添加到 spi_message 隊(duì)列 */
 ret = spi_sync(spi, &m); /* 同步傳輸 */
 return ret;
}

除了 init、exit、probe、remove、read、write 函數(shù)外,其他的函數(shù)看需求實(shí)現(xiàn),這幾個(gè)是最基本的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)投訴
  • 驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    12

    文章

    1818

    瀏覽量

    85110
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1688

    瀏覽量

    91215
  • 系統(tǒng)
    +關(guān)注

    關(guān)注

    1

    文章

    1006

    瀏覽量

    21293
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    深度解析Linux SPI總線和設(shè)備驅(qū)動(dòng)架構(gòu)

    SPI控制器不用關(guān)心設(shè)備的具體功能,它只負(fù)責(zé)把上層協(xié)議驅(qū)動(dòng)準(zhǔn)備好的數(shù)據(jù)按SPI總線的時(shí)序要求發(fā)送給SPI
    的頭像 發(fā)表于 02-07 08:16 ?8046次閱讀
    深度解析Linux <b class='flag-5'>SPI</b>總線和<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>架構(gòu)

    【DragonBoard 410c試用體驗(yàn)】9.DB410c開(kāi)發(fā)板SPI驅(qū)動(dòng)加載測(cè)試與nfc設(shè)備(PN532)-spi方式測(cè)試(failed)

    linux kernel3.2版本以后推薦使用dts來(lái)描述設(shè)備信息,spi驅(qū)動(dòng)框架按照這個(gè)規(guī)定做了一些修改。SPI子系統(tǒng)core部分首先被加
    發(fā)表于 10-11 16:57

    如何使用RT-Thread SPI設(shè)備驅(qū)動(dòng)

    菜單,修改the device name for console為uart1。開(kāi)啟SPI總線及設(shè)備驅(qū)動(dòng)并注冊(cè)SPI總線到系統(tǒng):進(jìn)入RT-Th
    發(fā)表于 10-25 14:20

    你想玩轉(zhuǎn)RT-Thread之SPI設(shè)備嗎?

    本應(yīng)用筆記以驅(qū)動(dòng)SPI接口的OLED顯示屏為例,說(shuō)明了如何添加SPI設(shè)備驅(qū)動(dòng)框架及底層硬件驅(qū)動(dòng),
    的頭像 發(fā)表于 04-17 10:20 ?1.9w次閱讀
    你想玩轉(zhuǎn)RT-Thread之<b class='flag-5'>SPI</b><b class='flag-5'>設(shè)備</b>嗎?

    嵌入式Linux系統(tǒng)驅(qū)動(dòng)原理和使用ARM Linux實(shí)現(xiàn)SPI驅(qū)動(dòng)程序的說(shuō)明

    介紹嵌入式Linux系統(tǒng)驅(qū)動(dòng)原理;分析SPI協(xié)議的通信原理和微處理器S3C2440A中SPI接口的硬件結(jié)構(gòu);闡述SPI
    發(fā)表于 11-14 16:36 ?11次下載
    嵌入式Linux<b class='flag-5'>系統(tǒng)</b>的<b class='flag-5'>驅(qū)動(dòng)</b>原理和使用ARM Linux實(shí)現(xiàn)<b class='flag-5'>SPI</b><b class='flag-5'>驅(qū)動(dòng)</b>程序的說(shuō)明

    SPI檢測(cè)是什么,SPI檢測(cè)設(shè)備的作用又是什么

    SPI是什么?SPI檢測(cè)是什么意思?SPI檢測(cè)設(shè)備的作用是什么?SPI是【Solder Paste Inspection】的簡(jiǎn)稱(chēng),中文叫【錫
    發(fā)表于 07-08 16:14 ?3w次閱讀

    嵌入式Linux SPI驅(qū)動(dòng)

    函數(shù)transfer_one_message: SPI發(fā)送護(hù)具函數(shù),發(fā)送一個(gè)spi_message數(shù)據(jù)1.2 SPI設(shè)備驅(qū)動(dòng)Linux內(nèi)核使
    發(fā)表于 11-01 17:05 ?14次下載
    嵌入式Linux <b class='flag-5'>SPI</b><b class='flag-5'>驅(qū)動(dòng)</b>

    硬件SPI與軟件模擬SPI速度區(qū)別實(shí)測(cè)

    硬件SPI與軟件模擬SPI速度區(qū)別實(shí)測(cè)目前為了程序移植方便,許多以SPI接口的芯片所提供的參考代碼大多都使用的是軟件SPI,比如筆者用過(guò)的存儲(chǔ)芯片W25Q16,
    發(fā)表于 12-22 19:13 ?9次下載
    硬件<b class='flag-5'>SPI</b>與軟件模擬<b class='flag-5'>SPI</b>速度區(qū)別實(shí)測(cè)

    什么是SPI?SPI設(shè)備選擇

    SPI 是英語(yǔ)Serial Peripheral interface的縮寫(xiě),顧名思義就是串行外圍設(shè)備接口。是Motorola(摩托羅拉)首先在其MC68HCXX系列處理器上定義的。
    的頭像 發(fā)表于 10-28 10:28 ?8538次閱讀

    SPI驅(qū)動(dòng)源文件目錄在哪

    /drivers/ spi/spidev.c linux 提供的 SPI 通用設(shè)備驅(qū)動(dòng)程序kernel- 4.14 /include/ linux /
    的頭像 發(fā)表于 07-25 10:49 ?749次閱讀
    <b class='flag-5'>SPI</b><b class='flag-5'>驅(qū)動(dòng)</b>源文件目錄在哪

    SPI通用接口層介紹

    SPI 通用接口層 SPI 通用接口層把具體的 SPI 設(shè)備的協(xié)議驅(qū)動(dòng)SPI 控制器
    的頭像 發(fā)表于 07-25 10:52 ?724次閱讀

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

    和相應(yīng)的設(shè)備進(jìn)行正確的數(shù)據(jù)交換 向通用接口層提供接口,使得上層的協(xié)議驅(qū)動(dòng)可以通過(guò)通用接口層訪問(wèn)控制器驅(qū)動(dòng) 配合通用接口層,完成數(shù)據(jù)消息隊(duì)列的排隊(duì)和處理,直到消息隊(duì)列變空為止 SPI
    的頭像 發(fā)表于 07-25 10:58 ?1143次閱讀
    <b class='flag-5'>SPI</b>控制器<b class='flag-5'>驅(qū)動(dòng)</b>層功能介紹

    SPI子系統(tǒng)driver軟件流程

    軟件流程 看懂該圖,對(duì)SPI 驅(qū)動(dòng)框架就有完整的了解了。 1、2、3 按順執(zhí)行,首先有 spi 總線的注冊(cè),然后是 spi 控制器驅(qū)動(dòng)加載,
    的頭像 發(fā)表于 07-25 11:01 ?729次閱讀
    <b class='flag-5'>SPI</b><b class='flag-5'>子系統(tǒng)</b>driver軟件流程

    SPI子系統(tǒng)SPI時(shí)序圖

    ,硬件設(shè)計(jì)必須注意信號(hào)質(zhì)量風(fēng)險(xiǎn),軟件開(kāi)發(fā)人員也要會(huì)看波形圖。 這里的參數(shù),一般 spi 驅(qū)動(dòng)不需要設(shè)置,但是半導(dǎo)體廠商提供的 spi 控制器驅(qū)動(dòng)中,可以修改這些參數(shù)
    的頭像 發(fā)表于 07-27 10:51 ?3397次閱讀
    <b class='flag-5'>SPI</b><b class='flag-5'>子系統(tǒng)</b>之<b class='flag-5'>SPI</b>時(shí)序圖

    Vision Board上的SPI設(shè)備驅(qū)動(dòng)配置和SPI主控的外部loopback功能測(cè)試

    感謝發(fā)燒友/* attach spi device */static int rt_spi_device_init(void){ ? ?struct rt_spi_configuration cfg
    的頭像 發(fā)表于 06-04 09:21 ?498次閱讀
    Vision Board上的<b class='flag-5'>SPI</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>配置和<b class='flag-5'>SPI</b>主控的外部loopback功能測(cè)試