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、通信协议及开发工具链等核心内容。

全部评论

相关推荐

评论
3
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务