spi驱动程序

mac2025-02-09  15

SPI核心层代码位于(drivers/spi/spi.c), 头文件位于(include/linux/spi/spi.h) spi.c一方面对SPI子系统进行初始化工作,注册spi bus,注册spi_master class,同事提供spi设备驱动对spi总线进行操作的API。 spi.h包含了spi核心层的一些重要数据结构,struct spi_master; struct spi_transfer; struct spi_message,以及一些实现比较简单的函数等。 SPI总线类型(drivers/spi/spi.c):

struct bus_type spi_bus_type = { .name = "spi", .dev_groups = spi_dev_groups, .match = spi_match_device, .uevent = spi_uevent, .pm = &spi_pm, };

通过bus_register()函数将SPI 总线注册进总线,成功注册后,在/sys/bus 下即可找到spi 文件目录。 SPI控制器设备类 (drivers/spi/spi.c):

static struct class spi_master_class = { .name = "spi_master", .owner = THIS_MODULE, .dev_release = spi_master_release, .dev_groups = spi_master_groups, };

通过调用class_register()函数注册设备类,成功注册后,在/sys/class目录下即可找到spi_master文件目录。 SPI类和总线注册 (drivers/spi/spi.c):

static int __init spi_init(void) { int status; ...... status = bus_register(&spi_bus_type); //注册spi bus if (status < 0) goto err1; status = class_register(&spi_master_class); //注册spi_master class if (status < 0) goto err2; ...... return status; }

spi总线从设备和从设备驱动匹配函数

static int spi_match_device(struct device *dev, struct device_driver *drv) { const struct spi_device *spi = to_spi_device(dev); return strcmp(spi->modalias, drv->name) == 0; }

将struct device_driver中的name字段与struct spi_device中的modalias字段进行匹配,匹配成功调用driver->probe函数 SPI类和总线注册 (drivers/spi/spi.c):

static int __init spi_init(void) { int status; ...... status = bus_register(&spi_bus_type); //注册spi bus if (status < 0) goto err1; status = class_register(&spi_master_class); //注册spi_master class if (status < 0) goto err2; ...... return status; }
最新回复(0)