内核中使用spi_master表示一个SPI主机控制器
一、SPI控制器驱动
1)spi_master申请与释放
SPI申请
struct spi_master *spi_alloc_master(struct device *dev, unsigned size)
dev一般是platform_device中的dev成员变量
size是私有数据大小
申请成功返回spi_master
SPI释放
void spi_master_put(struct spi_master *master)
2)SPI_master注册与注销
spi_master 初始化函数:
int spi_register_master(struct spi_master *master)
函数注销
void spi_unregister_master(struct spi_master *master)
二、SPI设备驱动
3)内核注册函数
int spi_register_driver(struct spi_driver *sdrv)
4)函数注销spi_driver
void spi_unregister_driver(struct spi_driver *sdrv)
三、SPI设备驱动中数据收发处理
1)spi_transfer
spi_transfer用于描述spi的传输信息
tx_buf、rx_buf分别是保存和接收数据
len是数据长度、spi是全双工通信
2)spi_message相当于spi_transfer的发送队列,spi_transfer需要添加到spi_message中发送出去。
3)spi_message_init()
spi_message需要用次函数去初始化
4)spi_message_add_tail()
spi_message初始化完成后使用spi_message_add_tail()函数把spi_transfer添加到spi_message中
void spi_message_add_tail(struct spi_transfer *t, struct spi_message *m)
四、实验
使用7020上的QSPI读写qflash
五、原理图
六、设备树
打开设备树system-user.dtsi文件
七、驱动程序
ax-spi-drv.c
/** ===================================================== **
*Author : ALINX Electronic Technology (Shanghai) Co., Ltd.
*Website: http://www.alinx.com
*Address: Room 202, building 18,
No.518 xinbrick Road,
Songjiang District, Shanghai
*Created: 2020-3-2
*Version: 1.0
** ===================================================== **/
#include <linux/err.h>
#include <linux/errno.h>
#include <linux/device.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/spi/spi.h>
#include <linux/spi/flash.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/fcntl.h>
#include <linux/platform_device.h>
#include <asm/mach/map.h>
#include <asm/uaccess.h>
#include <asm/io.h>
/* 驱动个数 */
#define AX_FLASH_CNT 1
/* 设备节点名称 */
#define AX_FLASH_NAME "ax_flash"
/* Flash操作命令 */
#define CMD_WRITE_ENABLE 0x06
#define CMD_BULK_ERASE 0xc7
#define CMD_READ_BYTES 0x03
#define CMD_PAGE_PROGRAM 0x02
#define CMD_MAX 5
struct ax_qflash_dev {
dev_t devid; //设备号
struct cdev cdev; //字符设备
struct class *class; //类
struct device *device; //设备
int major;