我知道我问这个问题可能看起来很简单,但由于某种原因,我无法理解如何在 Zephyr 中正确获取设备树绑定。
我有以下覆盖代码:
&uart0{
gps0 {
compatible="u-blox,m10";
uart-baudrate=<115200>;
status="okay";
label="gps0";
};
};
据我了解,gps0 是一个节点名称,因此我可以使用它在我的 C 代码中引用,我已完成如下操作:
#define GPS_NODE DT_NODELABEL(gps0)
int main(void)
{
int err = 0;
static const struct device *gnss_dev = DEVICE_DT_GET(GPS_NODE);
// Check if the GNSS device is ready
if (!device_is_ready(gnss_dev)) {
LOG_ERR("GNSS device not ready");
return -ENODEV;
}
Hove 进行此调用以获取设备树绑定,我收到以下错误:
__device_dts_ord_DT_N_NODELABEL_gps0_ORD) 表示 gps0 的设备节点在构建过程中未正确识别或链接。
Zephyr 文档 我理解此错误“可能意味着存在 Kconfig 问题,导致设备驱动程序无法构建,导致引用不存在。”
我不确定这到底意味着什么,但我认为这意味着我没有包含定义我需要的设备绑定所需的配置标头,在本例中是 UART 和 GNSS 配置。
以下是我当前的配置文件:
CONFIG_GPIO=y
CONFIG_SERIAL=y
CONFIG_UART_INTERRUPT_DRIVEN=y
CONFIG_UART_ASYNC_API=y
CONFIG_UART_WIDE_DATA=y\
CONFIG_GNSS=y
CONFIG_GNSS_U_BLOX_M10=y
CONFIG_GNSS_SATELLITES=y
CONFIG_GNSS_DUMP=y
尽管进行了此更改,我还是遇到了相同的错误。我觉得我对获取设备树绑定存在一个根本性的误解。谁能帮我找出我做错了什么?
我发现问题在于设备树覆盖,特别是我如何定义 GPS 设备。
实际上,正确的定义如下:
&uart0 {
status = "okay";
gps0: gps {
compatible = "u-blox,m10";
uart-baudrate = <115200>;
status = "okay";
};
};
之所以需要使用 gps0: gps 而不是仅使用 gps0 作为子header,是因为该结构将 gsp0 指定为节点标签,将 gps 指定为子节点。由于我使用的是 DT_NODELABEL 宏,因此主代码将查找如上面定义的 gps0 节点标签。
我认为标签属性已经贬值,因此它不用于节点标记,这是我的误解。
一旦您了解了上面对节点标签的基本理解,Zephyr 文档中的 belo 示例就更有意义了:
/ {
a-node {
subnode_nodelabel: a-sub-node {
foo = <3>;
};
};
};
我希望这可以节省您很多时间。