[RK3399][Android7.1]spi 的初始化

平台 内核版本 安卓版本
RK3399 Linux4.4 Android7.1


在这里插入图片描述

1 、spi_init() 子系统初始化(上半部分)

在这里插入图片描述
drivers/spi/spi.c

struct bus_type spi_bus_type = {
	.name = "spi",
	.dev_attrs = spi_dev_attrs,
	//match,用于后面设备,驱动的匹配
	.match = spi_match_device,
	.uevent = spi_uevent,};
postcore_initcall(spi_init);
static int __init spi_init(void)
{
	... 
	bus_register(&spi_bus_type);//会创建/sys/bus/spi/目录和子目录 drivers、devices 及相关属性文件
	... 
	class_register(&spi_master_class);//会创建 sys/class/spi_master/目录
	... 
}

2 、spi 从设备注册( 上半部分)

在这里插入图片描述

static LIST_HEAD(board_list);
#define TRICYCLE_GPIO4_26 (3*32 + 26) /* GPIO_4_26 */
static struct spi_board_info __initdata mcu_spi_device = {
	.modalias = "mcu_spi",
	.irq = IOMUX_TO_IRQ_V3(TRICYCLE_GPIO4_26),
	.max_speed_hz = 4000000, /* max spi SCK clock speed in HZ */
	.bus_num = 1,
	.chip_select = 2,
	… …,
};
start_kernel()rest_init()kernel_thread():
kernel_init→do_basic_setup()do_initcalls()do_one_initcall()arch_initcall(customize_machine)customize_machine()init_machine()mxc_board_init()

static void __init mxc_board_init(void)
{  … …;
	mx51_tricycle_init_mcu(); 
}

int __init mx51_tricycle_init_mcu(void)
{
	return spi_register_board_info(&mcu_spi_device, 1);
}

int __init spi_register_board_info(struct spi_board_info const *info, unsigned n)
{
	struct boardinfo *bi;
	bi = kmalloc(sizeof(*bi) + n * sizeof *info, GFP_KERNEL);
	bi->n_board_info = n;
	memcpy(bi->board_info, info, n * sizeof *info);//复制 spi_board_info 数据
	... ...;
	list_add_tail(&bi->list, &board_list);
	... ...;
}

3 、spi master 的相关注册 ( 晚于从设备注册( 上半部分) 进行)

在这里插入图片描述

目录arch/arm/mach-mx5/devices.c

static struct resource mxcspi1_resources[] = {
{
	.start = CSPI1_BASE_ADDR,
	.end = CSPI1_BASE_ADDR + SZ_4K - 1,
	.flags = IORESOURCE_MEM,
},
{
	.start = MXC_INT_CSPI1,
	.end = MXC_INT_CSPI1,
	.flags = IORESOURCE_IRQ,
},
… …;
};

4 、spi 从设备驱动注册

在这里插入图片描述
目录:drivers/mxc/tricycle/mcu/mcu_main.c

static struct spi_driver mcu_driver = {
	.driver = {
		.name = "mcu_spi",
		.bus = &spi_bus_type,},
	.probe = mcu_probe,};
subsys_initcall_sync(mcu_init);

static int __init mcu_init(void)
{
	return spi_register_driver(&mcu_driver);
}
	
int spi_register_driver(struct spi_driver *sdrv)
{if (sdrv->probe)
	sdrv->driver.probe = spi_drv_probe;//注册 mcu_driver,匹配相应的设备
	return driver_register(&sdrv->driver);
}

driver_register()–>bus_add_driver()–>driver_attach()–>bus_for_each_dev()–>__driver_attach()–>
driver_match_device()>spi_match_device() //展开如下
成功匹配后,driver_probe_device()
>really_probe()====> spi_drv_probe() //展开如下

发布了247 篇原创文章 · 获赞 93 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_33487044/article/details/91354653