平台 | 内核版本 | 安卓版本 |
---|---|---|
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() //展开如下