SPI 設備驅動
【設備】聲明在設備樹中
注意:設備的聲明,slave device node 應該包含在你所要掛載的 &spi node 下,將 device 綁定在 master 上。然后通過 pinctrl 方式指定 GPIO,并在驅動中操作 pinctrl 句柄。
【驅動】demo
Linux 內核使用 spi_driver 結構體來表示 spi 設備驅動,我們在編寫 SPI 設備驅動的時候需要實現 spi_driver。spi_driver 結構體定義在 include/linux/spi/spi.h 文件中。
spi_register_driver:注冊 spi_driver
spi_unregister_driver:銷掉 spi_driver
/* probe 函數 */
static int xxx_probe(struct spi_device *spi)
{
/* 具體函數內容 */
return 0;
}
/* remove 函數 */
static int xxx_remove(struct spi_device *spi)
{
/* 具體函數內容 */
return 0;
}
/* 傳統匹配方式 ID 列表 */
static const struct spi_device_id xxx_id[] = {
{"xxx", 0},
{}
};
/* 設備樹匹配列表 */
static const struct of_device_id xxx_of_match[] = {
{ .compatible = "xxx" },
{ /* Sentinel */ }
};
/* SPI 驅動結構體 */
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,
};
/* 驅動入口函數 */
static int __init xxx_init(void)
{
return spi_register_driver(&xxx_driver);
}
/* 驅動出口函數 */
static void __exit xxx_exit(void)
{
spi_unregister_driver(&xxx_driver);
}
module_init(xxx_init);
module_exit(xxx_exit);
在驅動入口函數中調用 spi_register_driver 來注冊 spi_driver。
在驅動出口函數中調用 spi_unregister_driver 來注銷 spi_driver。
spi 讀寫數據demo
/* SPI 多字節發送 */
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 隊列 */
ret = spi_sync(spi, &m); /* 同步傳輸 */
return ret;
}
/* SPI 多字節接收 */
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 隊列 */
ret = spi_sync(spi, &m); /* 同步傳輸 */
return ret;
}
除了 init、exit、probe、remove、read、write 函數外,其他的函數看需求實現,這幾個是最基本的。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
驅動
+關注
關注
12文章
1840瀏覽量
85293 -
SPI
+關注
關注
17文章
1706瀏覽量
91591 -
系統
+關注
關注
1文章
1017瀏覽量
21347
發布評論請先 登錄
相關推薦
【DragonBoard 410c試用體驗】9.DB410c開發板SPI驅動加載測試與nfc設備(PN532)-spi方式測試(failed)
linux kernel3.2版本以后推薦使用dts來描述設備信息,spi驅動框架按照這個規定做了一些修改。SPI子系統core部分首先被加
發表于 10-11 16:57
如何使用RT-Thread SPI設備驅動
菜單,修改the device name for console為uart1。開啟SPI總線及設備驅動并注冊SPI總線到系統:進入RT-Th
發表于 10-25 14:20
嵌入式Linux系統的驅動原理和使用ARM Linux實現SPI驅動程序的說明
介紹嵌入式Linux系統的驅動原理;分析SPI協議的通信原理和微處理器S3C2440A中SPI接口的硬件結構;闡述SPI
發表于 11-14 16:36
?11次下載
SPI檢測是什么,SPI檢測設備的作用又是什么
SPI是什么?SPI檢測是什么意思?SPI檢測設備的作用是什么?SPI是【Solder Paste Inspection】的簡稱,中文叫【錫
發表于 07-08 16:14
?3w次閱讀
嵌入式Linux SPI驅動
函數transfer_one_message: SPI發送護具函數,發送一個spi_message數據1.2 SPI設備驅動Linux內核使
發表于 11-01 17:05
?14次下載
硬件SPI與軟件模擬SPI速度區別實測
硬件SPI與軟件模擬SPI速度區別實測目前為了程序移植方便,許多以SPI接口的芯片所提供的參考代碼大多都使用的是軟件SPI,比如筆者用過的存儲芯片W25Q16,
發表于 12-22 19:13
?9次下載
什么是SPI?SPI設備選擇
SPI 是英語Serial Peripheral interface的縮寫,顧名思義就是串行外圍設備接口。是Motorola(摩托羅拉)首先在其MC68HCXX系列處理器上定義的。
SPI控制器驅動層功能介紹
和相應的設備進行正確的數據交換 向通用接口層提供接口,使得上層的協議驅動可以通過通用接口層訪問控制器驅動 配合通用接口層,完成數據消息隊列的排隊和處理,直到消息隊列變空為止 SPI 主
Vision Board上的SPI設備驅動配置和SPI主控的外部loopback功能測試
感謝發燒友/* attach spi device */static int rt_spi_device_init(void){ ? ?struct rt_spi_configuration cfg
評論