6.8 Linux 驱动开发 SPI驱动
一、重要的 API:
//初始化与注册:
int spi_register_driver(struct spi_driver *sdrv); // 注册SPI驱动
void spi_unregister_driver(struct spi_driver *sdrv); // 注销驱动
//数据传输:
int spi_sync(struct spi_device *spi, struct spi_message *message); // 同步传输,会阻塞,返回值: 0-成功传输, 负数-失败码:传输失败
int spi_async(struct spi_device *spi, struct spi_message *message); // 异步传输,即刻返回,不会阻塞,返回值: 0-成功(只是表示启动的异步传 输,并不表示已经传输成功), 负数-失败码
//辅助函数:
int spi_write(struct spi_device *spi, const void *buf, size_t len); // 只写
int spi_read(struct spi_device *spi, void *buf, size_t len); // 只读
int spi_write_then_read(struct spi_device *spi,
const void *txbuf, unsigned n_tx,
void *rxbuf, unsigned n_rx); // 先写后读
// 在使用 spi_message 之前需要对其进行初始化
void spi_message_init(struct spi_message *m)
// spi_message 初始化完成以后需要将 spi_transfer 添加到 spi_message 队列中
void spi_message_add_tail(struct spi_transfer *t, struct spi_message *m)
二、SPI 驱动框架:
#define DEVICE_NAME "spi_dev" // 设备名称
#define CLASS_NAME "spi_class" // 设备类名称
#define BUF_SIZE 64 // 缓冲区大小
static int major_num;
static struct class *dev_class;
static struct cdev spi_cdev;
// 设备私有数据结构
struct spi_device_data {
struct spi_device *spi; // SPI设备指针
char tx_buf[BUF_SIZE]; // 发送缓冲区
char rx_buf[BUF_SIZE]; // 接收缓冲区
};
// 打开设备
static int spi_dev_open(struct inode *inode, struct file *filp) {
struct spi_device_data *data;
// 分配私有数据
data = kzalloc(sizeof(*data), GFP_KERNEL);
if (!data)
return -ENOMEM;
// 关联私有数据
filp->private_data = data;
return 0;
}
// 释放设备
static int spi_dev_release(struct inode *inode, struct file *filp) {
struct spi_device_data *data = filp->private_data;
kfree(data);
return 0;
}
// 读写操作(SPI全双工传输)
static ssize_t spi_dev_rw(struct file *filp, char __user *buf, size_t count, loff_t *pos, int is_write) {
struct spi_device_data *data = filp->private_data;
struct spi_transfer t = {
.tx_buf = data-
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++/嵌入式开发 秋招面经 文章被收录于专栏
一名985硕,在25年秋招中斩获多个C++/嵌入式开发Offer。本专栏将分享我的面经,涵盖C/C++、操作系统、计算机网络、ARM体系与架构、Linux应用/驱动开发、Qt、通信协议及开发工具链等核心内容。
