imx6ul+rtc使用

Source-lib外设库第五弹;

现在看网上最多设置rtc事件是用date命令和hwclock命令来设置;

现在我们用c来写:
#include "so_lib.h"
#include "bsp_rtc.h"

int main(int argc, char** argv)
{
        int dev_fd;
        dev_fd = rtc_init_time("2017-11-30 21:20:00");

        rtc_deinit(dev_fd);

        return 0;
}
这次主函数真的超级简单,初始化rtc时间,然后释放rtc。
编译运行下,等会咱们再来看代码;

老规矩先安装库:
install --mode=644 libslhl.so /usr/local/lib/
install --mode=644 libslbsp.so /usr/local/lib/
运行程序:
./source-rtc_test
没有报错;

执行命令查看下rtc的时间是否更新对:
hwclock -r


什么情况怎么多l一个月。

EXPORT int rtc_init_time(const char *dt)
{
        int dev_fd = -1;
        dev_fd = open_hardware(RTC_PATH, O_RDWR | O_NONBLOCK);
        if (dev_fd == -1)
                return -1;
        if (set_rtc_time(dev_fd, dt) == -1)
                return -1;
        return  dev_fd;
}
这段代码没有问题,再看下set_rtc_time函数:
/*
        使用方法:char *dt = "2017-11-30 18:59:00"
*/
EXPORT int set_rtc_time(int dev_fd, const char *dt)
{
        struct rtc_time rtc_tm;

        int ret = sscanf(dt, "%d-%d-%d %d:%d:%d", &rtc_tm.tm_year, &rtc_tm.tm_mon, \
                                                                                                &rtc_tm.tm_mday, &rtc_tm.tm_hour, \
                                                                                                &rtc_tm.tm_min, &rtc_tm.tm_sec);
        if (ret != 6) {
                ERR("Time not match");
                return -1;
        }
        ret = ioctl(dev_fd, RTC_SET_TIME, &rtc_tm);
        if (ret == -1) {
                ERR("ioctl RTC_RD_TIME");
        }
        return ret;
}
这段代码验证了下也没有问题;

查看内核代码后发现问题:

mon = rtc_tm.tm_mon + 1;    tm_mon starts at zero

修改代码:
EXPORT int set_rtc_time(int dev_fd, const char *dt)
{
        struct rtc_time rtc_tm;

        int ret = sscanf(dt, "%d-%d-%d %d:%d:%d", &rtc_tm.tm_year, &rtc_tm.tm_mon, \

                                                                        
                        &rtc_tm.tm_mday, &rtc_tm.tm_hour, \

                                                                        
                       &rtc_tm.tm_min, &rtc_tm.tm_sec);
        if (ret != 6) {
                ERR("Time not match");
                return -1;
        }
rtc_tm.tm_mon -= 1;
        ret = ioctl(dev_fd, RTC_SET_TIME, &rtc_tm);
        if (ret == -1) {
                ERR("ioctl RTC_RD_TIME");
        }
        return ret;
}
最后编译测试问题解决,效果如下:

你可能感兴趣的:(linux学习过程)