Trying to use device_get_binding() function for the NRFX_RTC0 and using rtc_read() to extract the time.Not able to bind RTC device.
/* * Copyright (c) 2019 Nordic Semiconductor ASA * * SPDX-License-Identifier: LicenseRef-BSD-5-Clause-Nordic */ #include <zephyr.h> #include <nrf_socket.h> #include <net/socket.h> #include <stdio.h> #include <device.h> #include <drivers/rtc.h> #include <sys/printk.h> #define AT_XSYSTEMMODE "AT\%XSYSTEMMODE=0,0,1,0" #define AT_CFUN "AT+CFUN=1" #ifdef CONFIG_BOARD_NRF9160_PCA10090NS #define AT_MAGPIO "AT\%XMAGPIO=1,0,0,1,1,1574,1577" #endif static const char update_indicator[] = {'\\', '|', '/', '-'}; static const char at_commands[][31] = { AT_XSYSTEMMODE, #ifdef CONFIG_BOARD_NRF9160_PCA10090NS AT_MAGPIO, #endif AT_CFUN }; static int fd; static char nmea_strings[10][NRF_GNSS_NMEA_MAX_LEN]; static u32_t nmea_string_cnt; static bool got_first_fix; static bool update_terminal; static u64_t fix_timestamp; nrf_gnss_data_frame_t last_fix; #define ALARM (RTC_ALARM_SECOND) void test_rtc_interrupt_fn(struct device *rtc_dev) { u32_t now = rtc_read(rtc_dev); printk("Alarm\n"); rtc_set_alarm(rtc_dev, now + ALARM); } void bsd_recoverable_error_handler(uint32_t error) { printf("Err: %lu\n", (unsigned long)error); } void bsd_irrecoverable_error_handler(uint32_t error) { printf("Irrecoverable: %lu\n", (unsigned long)error); } static int enable_gps(void) { int at_sock; int bytes_sent; int bytes_received; char buf[2]; at_sock = socket(AF_LTE, 0, NPROTO_AT); if (at_sock < 0) { return -1; } for (int i = 0; i < ARRAY_SIZE(at_commands); i++) { bytes_sent = send(at_sock, at_commands[i], strlen(at_commands[i]), 0); if (bytes_sent < 0) { close(at_sock); return -1; } do { bytes_received = recv(at_sock, buf, 2, 0); } while (bytes_received == 0); if (memcmp(buf, "OK", 2) != 0) { close(at_sock); return -1; } } close(at_sock); return 0; } static int init_app(void) { u16_t fix_retry = 0; u16_t fix_interval = 1; u16_t nmea_mask = NRF_CONFIG_NMEA_GSV_MASK | NRF_CONFIG_NMEA_GSA_MASK | NRF_CONFIG_NMEA_GLL_MASK | NRF_CONFIG_NMEA_GGA_MASK | NRF_CONFIG_NMEA_RMC_MASK; int retval; if (enable_gps() != 0) { printk("Failed to enable GPS\n"); return -1; } fd = nrf_socket(NRF_AF_LOCAL, NRF_SOCK_DGRAM, NRF_PROTO_GNSS); if (fd >= 0) { printk("Socket created\n"); } else { printk("Could not init socket (err: %d)\n", fd); return -1; } retval = nrf_setsockopt(fd, NRF_SOL_GNSS, NRF_SO_GNSS_FIX_RETRY, &fix_retry, sizeof(uint16_t)); if (retval != 0) { printk("Failed to set fix retry value\n"); return -1; } retval = nrf_setsockopt(fd, NRF_SOL_GNSS, NRF_SO_GNSS_FIX_INTERVAL, &fix_interval, sizeof(uint16_t)); if (retval != 0) { printk("Failed to set fix interval value\n"); return -1; } retval = nrf_setsockopt(fd, NRF_SOL_GNSS, NRF_SO_GNSS_NMEA_MASK, &nmea_mask, sizeof(uint16_t)); if (retval != 0) { printk("Failed to set nmea mask\n"); return -1; } retval = nrf_setsockopt(fd, NRF_SOL_GNSS, NRF_SO_GNSS_START, NULL, 0); if (retval != 0) { printk("Failed to start GPS\n"); return -1; } return 0; } static void print_satellite_stats(nrf_gnss_data_frame_t *pvt_data) { u8_t tracked = 0; u8_t in_fix = 0; u8_t unhealthy = 0; for (int i = 0; i < NRF_GNSS_MAX_SATELLITES; ++i) { if ((pvt_data->pvt.sv[i].sv > 0) && (pvt_data->pvt.sv[i].sv < 33)) { tracked++; if (pvt_data->pvt.sv[i].flags & NRF_GNSS_PVT_FLAG_FIX_VALID_BIT) { in_fix++; } if (pvt_data->pvt.sv[i].flags & NRF_GNSS_SV_FLAG_UNHEALTHY) { unhealthy++; } } } printk("Tracking: %d Using: %d Unhealthy: %d", tracked, in_fix, unhealthy); printk("\nSeconds since last fix %lld\n", (k_uptime_get() - fix_timestamp) / 1000); } static void print_pvt_data(nrf_gnss_data_frame_t *pvt_data) { printf("Longitude: %f\n", pvt_data->pvt.longitude); printf("Latitude: %f\n", pvt_data->pvt.latitude); printf("Altitude: %f\n", pvt_data->pvt.altitude); printf("Speed: %f\n", pvt_data->pvt.speed); printf("Heading: %f\n", pvt_data->pvt.heading); printk("Date: %02u-%02u-%02u\n", pvt_data->pvt.datetime.day, pvt_data->pvt.datetime.month, pvt_data->pvt.datetime.year); printk("Time (UTC): %02u:%02u:%02u\n", pvt_data->pvt.datetime.hour, pvt_data->pvt.datetime.minute, pvt_data->pvt.datetime.seconds); } static void print_nmea_data(void) { printk("NMEA strings:\n"); for (int i = 0; i < nmea_string_cnt; ++i) { printk("%s\n", nmea_strings[i]); } } int process_gps_data(nrf_gnss_data_frame_t *gps_data) { int retval; retval = nrf_recv(fd, gps_data, sizeof(nrf_gnss_data_frame_t), NRF_MSG_DONTWAIT); if (retval > 0) { switch (gps_data->data_id) { case NRF_GNSS_PVT_DATA_ID: if ((gps_data->pvt.flags & NRF_GNSS_PVT_FLAG_FIX_VALID_BIT) == NRF_GNSS_PVT_FLAG_FIX_VALID_BIT) { if (!got_first_fix) { got_first_fix = true; } fix_timestamp = k_uptime_get(); memcpy(&last_fix, gps_data, sizeof(nrf_gnss_data_frame_t)); nmea_string_cnt = 0; update_terminal = true; } break; case NRF_GNSS_NMEA_DATA_ID: if (nmea_string_cnt < 10) { memcpy(nmea_strings[nmea_string_cnt++], gps_data->nmea, retval); } break; default: break; } } return retval; } static inline void rtc_enable_gps(struct device *dev) { counter_start(dev); } int main(void) { struct rtc_config config; struct device *rtc_dev; printk("Test RTC driver\n"); rtc_dev = device_get_binding("NRFX_RTC0"); if (!rtc_dev) { printk("Cannot get RTC device\n"); } rtc_enable_gps(rtc_dev); printk("After enabling rtc\n"); printk("After device binding\n"); config.init_val = 0U; config.alarm_enable = 1U; config.alarm_val = ALARM; printk("After seting alarm value\n"); //config.cb_fn = test_rtc_interrupt_fn; rtc_set_config(rtc_dev, &config); nrf_gnss_data_frame_t gps_data; u8_t cnt = 0; printk("Staring GPS application\n"); if (init_app() != 0) { return -1; } printk("Getting GPS data...\n"); while (1) { do { /* Loop until we don't have more * data to read */ } while (process_gps_data(&gps_data) > 0); if (!got_first_fix) { cnt++; printk("\033[1;1H"); printk("\033[2J"); print_satellite_stats(&gps_data); printk("\nScanning [%c] ", update_indicator[cnt%4]); } if (((k_uptime_get() - fix_timestamp) >= 1) && (got_first_fix)) { printk("\033[1;1H"); printk("\033[2J"); print_satellite_stats(&gps_data); printk("---------------------------------\n"); print_pvt_data(&last_fix); printk("\n"); print_nmea_data(); printk("---------------------------------"); update_terminal = false; } k_sleep(K_MSEC(500)); } return 0; }