spi驱动笔记
用户接口层
spidev.c /*为应用层提供操作接口*/
open write read
========================================================================
.write = spidev_write,
.read = spidev_read,
.unlocked_ioctl = spidev_ioctl,
.compat_ioctl = spidev_compat_ioctl,
.open = spidev_open,
.release = spidev_release,
平台依赖层
实现相应平台的spi控制器驱动spi_s3c24XX.c
1. SPI core
2. platform driver
3. platform device
描述了中断号、中断触发电平、寄存器基地址等信息
随后使用可以调用 platform_get_resource 标准获取
实现了驱动和资源的分离
硬件抽象层
提供核心数据结构定义,SPI控制器驱动和设备驱动的注册、注销管理等
=============================================================================
spidev.c 系统通用型驱动
=============================================================================
spidev_init分析:
static int __init spidev_init(void)
/*1.设备注册*/
status = register_chrdev(SPIDEV_MAJOR, "spi", &spidev_fops);
/*2.创建类*/
spidev_class = class_create(THIS_MODULE, "spidev");
注:设备结点的创建是在探测到设备之后:
spidev_probe(){...
dev = device_create(spidev_class, &spi->dev, spidev->devt,
spidev, "spidev%d.%d",spi->master->bus_num,
spi->chip_select);
... }
/*注册SPI设备驱动*/
status = spi_register_driver(&spidev_spi_driver);
spidev_open 分析:
static int spidev_open(struct inode *inode, struct file *filp)
/*1.创建结构体*/
struct spidev_data *spidev; /*包含设备相关信息*/
/*2.将SPI结构放入file_operations 结构的私有数据中*/
filp->private_data = spidev;
nonseekable_open(inode, filp);
spidev_read 分析:
spidev_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
/*1.创建spi数据结构*/
struct spidev_data *spidev;
/*2.获取私有数据中的spidev结构*/
spidev = filp->private_data;
/*3.通过底层操作函数读*/
spidev_sync_read(spidev, count);
spi_message_init(&m);
spi_message_add_tail(&t, &m);
return spidev_sync(spidev, &m);
status = spi_async(spidev->spi, message);
struct spi_message {
struct list_head transfers;
struct spi_device *spi;
unsigned is_dma_mapped:1;
void (*complete)(void *context);
void *context;
unsigned actual_length;
int status;
struct list_head queue;
void *state;
};
spidev_write 分析:
和读操作相似
主要数据结构
=======================================================
struct spi_device/*主机端用于描述SPI从设备*/
struct spi_driver /*客户端协议驱动*/
struct spi_driver {
const struct spi_device_id *id_table;
int (*probe)(struct spi_device *spi);
int (*remove)(struct spi_device *spi);
void (*shutdown)(struct spi_device *spi);
int (*suspend)(struct spi_device *spi, pm_message_t mesg);
int (*resume)(struct spi_device *spi);
struct device_driver driver;
};
看贴怎就没人顶。。
{:3_204:}
随便顶,到处顶,不介意 求交友:qq:2379374402
只爱linux 回复 3# wwxxxxll
原来你的处女贴发我这来了。。哈哈
页:
[1]