设备初始化表
<p><code>device_get_binding</code>从驱动名获取设备。设备时钟打开是在设备初始化函数</p>
<pre><code>#define DEVICE_INIT_SECTIONS()          \
        __device_init_start = .;    \
        DEVICE_INIT_LEVEL(PRE_KERNEL_1) \
        DEVICE_INIT_LEVEL(PRE_KERNEL_2) \
        DEVICE_INIT_LEVEL(POST_KERNEL)  \
        DEVICE_INIT_LEVEL(APPLICATION)  \
        __device_init_end = .;      \
        DEVICE_BUSY_BITFIELD()      \</code></pre>
<pre><code>#define DEVICE_INIT(dev_name, drv_name, init_fn, data, cfg_info, level, prio) \
    DEVICE_AND_API_INIT(dev_name, drv_name, init_fn,\
    data, cfg_info, level, prio, NULL)
#ifndef CONFIG_DEVICE_POWER_MANAGEMENT
#define DEVICE_AND_API_INIT(dev_name, drv_name, init_fn, data, cfg_info,  \
                level, prio, api)                 \
    static struct device_config _CONCAT(__config_, dev_name) __used   \
    __attribute__((__section__(".devconfig.init"))) = {       \
        .name = drv_name, .init = (init_fn),              \
        .config_info = (cfg_info)                 \
    };                                \
    static Z_DECL_ALIGN(struct device) _CONCAT(__device_, dev_name) __used \
    __attribute__((__section__(".init_" #level STRINGIFY(prio)))) = { \
        .config = &_CONCAT(__config_, dev_name),          \
        .driver_api = api,                    \
        .driver_data = data                   \
    }
#else
#define DEVICE_AND_API_INIT(dev_name, drv_name, init_fn, data, cfg_info, \
                level, prio, api)                \
    DEVICE_DEFINE(dev_name, drv_name, init_fn,           \
              device_pm_control_nop, data, cfg_info, level,  \
              prio, api)
#endif</code></pre>