https://developer.canaan-creative.com/k230/zh/dev/01_software/board/osdrv/K230_PMU_%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97.html
我在这个参考文档看到了pmu的使用方法 有两个疑问
- pmu是不是只能在linux下的input子系统中使用?
- rtos only是不是只能使用IO0至IO63?
- rtos only是不是不支持gpio中断功能? 如果支持该如何使用?
https://developer.canaan-creative.com/k230/zh/dev/01_software/board/osdrv/K230_PMU_%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97.html
我在这个参考文档看到了pmu的使用方法 有两个疑问
/**
* @file zj_time.c
* @brief
* @version 1.0.0
* @date 2025年4月12日17:29:39
*/
#include <sys/time.h>
#include <time.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
/* 最后包含自定义头文件 */
#include "zj_log.h"
#include "zj_time.h"
/* 时间设备命令定义 */
#define MISC_DEV_CMD_NTP_SYNC (0x1024 + 7)
#define MISC_DEV_CMD_GET_UTC_TIMESTAMP (0x1024 + 8)
#define MISC_DEV_CMD_SET_UTC_TIMESTAMP (0x1024 + 9)
#define MISC_DEV_CMD_GET_LOCAL_TIME (0x1024 + 10)
#define MISC_DEV_CMD_SET_TIMEZONE (0x1024 + 11)
#define MISC_DEV_CMD_GET_TIMEZONE (0x1024 + 12)
/**
* @brief 通过misc设备获取/设置系统信息
* @param cmd 命令ID
* @param args 参数指针
* @return 0-成功,其他-失败
*/
static int canmv_misc_dev_ioctl(int cmd, void* args)
{
int misc_dev_fd = -1;
int ret = -1;
// 打开misc设备
misc_dev_fd = open("/dev/canmv_misc", O_RDWR);
if (misc_dev_fd < 0) {
LOG_I("无法打开misc设备: %s", strerror(errno));
return -1;
}
// 执行ioctl命令
ret = ioctl(misc_dev_fd, cmd, args);
if (ret != 0) {
LOG_I("ioctl misc设备失败,命令 %x: %s", cmd, strerror(errno));
close(misc_dev_fd);
return -2;
}
// 关闭设备
close(misc_dev_fd);
return 0;
}
/**
* @brief 获取当前UTC时间戳
* @return 当前UTC时间戳(秒),失败返回0
*/
time_t get_timestamp(void)
{
time_t timestamp = 0;
if (canmv_misc_dev_ioctl(MISC_DEV_CMD_GET_UTC_TIMESTAMP, ×tamp) != 0) {
LOG_I("获取时间戳失败");
return 0;
}
return timestamp;
}
/**
* @brief 获取本地时间
* @param tm_info 输出参数,存储本地时间信息
* @return 0-成功,其他-失败
*/
int get_localtime(struct tm* tm_info)
{
if (!tm_info) {
return -1;
}
if (canmv_misc_dev_ioctl(MISC_DEV_CMD_GET_LOCAL_TIME, tm_info) != 0) {
LOG_I("获取本地时间失败");
return -2;
}
return 0;
}
/**
* @file zj_time.c
* @brief
* @version 1.0.0
* @date 2025年4月12日17:29:39
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>
#include <sys/ioctl.h>
#include <sys/time.h>
/* 时间设备命令定义 */
#define MISC_DEV_CMD_NTP_SYNC (0x1024 + 7)
#define MISC_DEV_CMD_GET_UTC_TIMESTAMP (0x1024 + 8)
#define MISC_DEV_CMD_SET_UTC_TIMESTAMP (0x1024 + 9)
#define MISC_DEV_CMD_GET_LOCAL_TIME (0x1024 + 10)
#define MISC_DEV_CMD_SET_TIMEZONE (0x1024 + 11)
#define MISC_DEV_CMD_GET_TIMEZONE (0x1024 + 12)
/**
* @brief 通过misc设备获取/设置系统信息
* @param cmd 命令ID
* @param args 参数指针
* @return 0-成功,其他-失败
*/
static int canmv_misc_dev_ioctl(int cmd, void* args)
{
int misc_dev_fd = -1;
int ret = -1;
// 打开misc设备
misc_dev_fd = open("/dev/canmv_misc", O_RDWR);
if (misc_dev_fd < 0) {
printf("无法打开misc设备: %s", strerror(errno));
return -1;
}
// 执行ioctl命令
ret = ioctl(misc_dev_fd, cmd, args);
if (ret != 0) {
printf("ioctl misc设备失败,命令 %x: %s", cmd, strerror(errno));
close(misc_dev_fd);
return -2;
}
// 关闭设备
close(misc_dev_fd);
return 0;
}
/**
* @brief 获取当前UTC时间戳
* @return 当前UTC时间戳(秒),失败返回0
*/
time_t get_timestamp(void)
{
time_t timestamp = 0;
if (canmv_misc_dev_ioctl(MISC_DEV_CMD_GET_UTC_TIMESTAMP, ×tamp) != 0) {
printf("获取时间戳失败");
return 0;
}
return timestamp;
}
/**
* @brief 获取本地时间
* @param tm_info 输出参数,存储本地时间信息
* @return 0-成功,其他-失败
*/
int get_localtime(struct tm* tm_info)
{
if (!tm_info) {
return -1;
}
if (canmv_misc_dev_ioctl(MISC_DEV_CMD_GET_LOCAL_TIME, tm_info) != 0) {
printf("获取本地时间失败");
return -2;
}
return 0;
}
你好,这个我测试编译不会报错的