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è)是最基本的。
-
驅(qū)動(dòng)
+關(guān)注
關(guān)注
12文章
1818瀏覽量
85110 -
SPI
+關(guān)注
關(guān)注
17文章
1688瀏覽量
91215 -
系統(tǒng)
+關(guān)注
關(guān)注
1文章
1006瀏覽量
21293
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論