我正在尝试使用 Zephyr 项目中存在的设备驱动程序。
据我了解导入驱动程序的步骤如下:
# Copyright (c) 2023 Trackunit Corporation
# SPDX-License-Identifier: Apache-2.0
menuconfig GNSS
bool "GNSS drivers"
select EXPERIMENTAL
help
Enable GNSS drivers and configuration.
if GNSS
config GNSS_SATELLITES
bool "GNSS satellites support"
help
Enable GNSS sattelites callback.
config GNSS_DUMP
bool "GNSS dump support"
depends on LOG
help
Enable GNSS dump library
config GNSS_DUMP_TO_LOG
bool "Dump GNSS events to log"
select GNSS_DUMP
help
Enable GNSS dump to log.
if GNSS_DUMP_TO_LOG
config GNSS_DUMP_TO_LOG_BUF_SIZE
int "GNSS log dump buffer size"
default 128
help
Size of GNSS log dump buffer
endif
config GNSS_PARSE
bool "GNSS parsing utilities"
help
Enable GNSS parsing utilities.
config GNSS_NMEA0183
bool "NMEA0183 parsing utilities"
select GNSS_PARSE
help
Enable NMEA0183 parsing utilities.
config GNSS_NMEA0183_MATCH
bool "GNSS NMEA0183 match utilities"
select GNSS_NMEA0183
help
Enable NMEA0183 match utilities.
config GNSS_INIT_PRIORITY
int "GNSS driver initialization priority"
default 80
range 0 99
help
Driver initialization priority for GNSS drivers.
config GNSS_U_BLOX_PROTOCOL
bool "GNSS U-BLOX protocol"
select MODEM_UBX
help
Enable gnss u-blox protocol.
module = GNSS
module-str = gnss
source "subsys/logging/Kconfig.template.log_config"
rsource "Kconfig.emul"
rsource "Kconfig.generic"
rsource "Kconfig.quectel_lcx6g"
rsource "Kconfig.u_blox_m10"
rsource "Kconfig.luatos_air530z"
endif
我已经包含了 config 关键字之后的所有配置。
# Copyright 2024 NXP
# SPDX-License-Identifier: Apache-2.0
config GNSS_U_BLOX_M10
bool "U-BLOX M10 GNSS Module"
default y
depends on GNSS
depends on DT_HAS_U_BLOX_M10_ENABLED
select MODEM_MODULES
select MODEM_BACKEND_UART
select MODEM_CHAT
select MODEM_UBX
select GNSS_PARSE
select GNSS_NMEA0183
select GNSS_NMEA0183_MATCH
select GNSS_U_BLOX_PROTOCOL
select UART_USE_RUNTIME_CONFIGURE
help
Enable U-BLOX M10 GNSS modem driver.
config GNSS_U_BLOX_M10_SATELLITES_COUNT
int "Maximum satellite count"
depends on GNSS_SATELLITES
default 24
help
Maximum number of satellite that the driver that can be decoded from
the GNSS device. This does not affect the number of devices that the
device is actually tracking, just how many of those can be reported
in the satellites callback.
在此之后,我100%不确定要做什么,但根据之前的经验,我应该能够导入驱动程序文件并使用这些功能。
为此,我在 main.c 文件中包含以下语句:
#include <zephyr/drivers/gnss/gnss_u_blox_m10.c>
然而,这是一个错误。因此,在对此事进行了更多研究后,我了解到该设备仅使用通用 gnss 接口来获取数据。
这是真的吗?在查看 GNSS 示例时,它仅使用以下代码进行数据收集:
static void gnss_data_cb(const struct device *dev, const struct gnss_data *data)
{
if (data->info.fix_status != GNSS_FIX_STATUS_NO_FIX) {
printf("Got a fix!\n");
}
}
GNSS_DATA_CALLBACK_DEFINE(GNSS_MODEM, gnss_data_cb);
我应该使用如上所示的通用接口吗?
有没有一些参考资料可以清楚地说明这一点?
您缺少启用 GNSS 硬件的一个关键部分,并且没有完全正确使用您帖子中的 API。一般来说,对于任何硬件设备,您应遵循的步骤是:
boards/
文件夹中有两个板覆盖层,其中包含有关如何将 GNSS 模块声明为其所连接的关联 UART 控制器的子级的示例。CONFIG_GNSS
以及您不喜欢默认设置的任何其他设置。对于实际驱动程序(即 CONFIG_GNSS_U_BLOX_M10
),它通常设置为 y
,因此只有当存在匹配节点并且设备树中的 status
时才是 "okay"
。注意对DT_HAS_U_BLOX_M10_ENABLED
的依赖,这个Kconfig是由devicetree生成的,不能被项目覆盖。如果未启用,您将无法强制 CONFIG_GNSS_U_BLOX_M10
,因为即使在项目中将值设置为 y
,它仍然会尊重其依赖项。