I2C、SPI设备树驱动对设备子节点的处理

对于i2c, spi等总线节点会转换为platform_device然后它们下面的子节点交给父节点的platform_driver里面probe函数处理

1、I2C总线节点的处理过程:

 /i2c节点一般表示i2c控制器, 它会被转换为platform_device, 在内核中有对应的platform_driver;
   platform_driver的probe函数中会调用i2c_add_numbered_adapter:
   
   i2c_add_numbered_adapter   // drivers/i2c/i2c-core-base.c
        __i2c_add_numbered_adapter
               i2c_register_adapter
                   of_i2c_register_devices(adap);   // drivers/i2c/i2c-core-of.c
                       for_each_available_child_of_node(bus, node) {
                                        client = i2c_new_device(adap, &info);   // 设备树中的i2c子节点被转换为i2c_client
                    }

2、 SPI总线节点的处理过程:

 /spi节点一般表示spi控制器, 它会被转换为platform_device, 在内核中有对应的platform_driver;
   platform_driver的probe函数中会调用spi_register_master, 即spi_register_controller:
   
   spi_register_controller        // drivers/spi/spi.c
        of_register_spi_devices   // drivers/spi/spi.c
            for_each_available_child_of_node(ctlr->dev.of_node, nc) {
                spi = of_register_spi_device(ctlr, nc);  // 设备树中的spi子节点被转换为spi_device
                                spi = spi_alloc_device(ctlr);
                                rc = of_spi_parse_dt(ctlr, spi, nc);
                                rc = spi_add_device(spi);
            }

 

 

 

 

 

 

你可能感兴趣的:(linux驱动开发)