Zephyr - 设备驱动和设备模型
介绍
Zephyr 内核支持大量的设备驱动程序。应用程序板级配置的可用设备驱动集合随着所关联的硬件组件和设备驱动软件的变化而变化。
Zephyr 的设备模型为配置驱动程序提供了一致的设备模型。设备模型负责初始化配置到系统中的所有驱动。
每种类型的驱动程序(UAR,SPI,I2C)都有一个通用类型的 API。
在这个模型中,当驱动程序初始化时,驱动中会填充指向包含指向它的 API 函数的结构的指针。这些结构体被按照初始化等级放到 RAM 区。
标准驱动
所有的板级配置中都支持的设备驱动包括:
-
中断控制器:用于内核的中断管理子系统。
-
定时器:用于内核的系统时钟和硬件时钟子系统。
-
串行通信:用于内核的系统控制台子系统。
-
随机数生产器:提供随机数源。
… important::
这种设备驱动的确切实现并不会产生真正意义上的随机数,只是一个近似随机的数。
同步调用
Zephyr 对多种板子提供了一系列的设备驱动程序。除非硬件不支持,否则每个驱动都应当提供基于中断(而不是轮询)的实现。
通过上层的设备API来调用这些驱动, 例如 i2c.h spi.h, 他们通常被特意设计为同步操作, 这些调用会产生阻塞.
驱动程序 API
:file:device.h
中提供了如下关于设备驱动程序的 API。这些 API 只能用于设备驱动程序中,不能应用于应用程序中。
:c:func:DEVICE_INIT()
创建设备对象,并在启动的初始化阶段调用其初始化函数。
:c:func:DEVICE_AND_API_INIT()
创建设备对象,并在启动的初始化阶段调用其初始化函数。此外,它还用一个指针指向驱动程序的 API。
:c:func:DEVICE_NAME_GET()
获得一个全局设别对象的全名。
:c:func:DEVICE_GET()
通过名字获取一个执行设备对象的指针。
:c:func:DEVICE_DECLARE()
声明一个设备对象。
<