domenor

domenor

0个粉丝

17

问答

0

专栏

1

资料

domenor  发布于  2017-09-11 09:54:58
采纳率 0%
17个问答
3003

关于Hi3516A的RTC问题,有点蹊跷

 
我们近期升级了硬件,增加了RTC电路,为了兼容两款硬件,程序在开始时检测RTC频率,如果为32.768则执行,若否,则不执行
现在问题来了,我们发现在之前没有RTC电路的板子上运行该程序,居然也有一部分板子能检查到正确的频率,这时程序再往下执行就会造成死机
这真的是非常奇怪,程序我楼下会贴出来
我来回答
回答2个
时间排序
认可量排序

domenor

0个粉丝

17

问答

0

专栏

1

资料

domenor 2017-09-11 09:57:03
认可0
[code]#include
#include
#include
#include
#include
#include
#include
#include

typedef struct {
        unsigned int  year;
        unsigned int  month;
        unsigned int  date;
        unsigned int  hour;
        unsigned int  minute;
        unsigned int  second;
        unsigned int  weekday;
} rtc_time_t;

typedef        struct {
        unsigned char reg;
        unsigned char val;
} reg_data_t;

typedef enum temp_sel_mode {
        TEMP_SEL_FIXMODE  = 0,
        TEMP_SEL_OUTSIDE,
        TEMP_SEL_INTERNAL,
} temp_sel_mode;

typedef struct {
        temp_sel_mode mode;
        int value;
} reg_temp_mode_t;

typedef struct {
        unsigned int freq_l;
} rtc_freq_t;

#define HI_RTC_AIE_ON                _IO('p', 0x01)
#define HI_RTC_AIE_OFF                _IO('p', 0x02)

#define HI_RTC_COMP_ON                _IO('p', 0x03)
#define HI_RTC_COMP_OFF                _IO('p', 0x04)

#define HI_RTC_GET_FREQ                _IOR('P', 0x05, rtc_freq_t)
#define HI_RTC_SET_FREQ                _IOW('p', 0x06, rtc_freq_t)

#define HI_RTC_ALM_SET                _IOW('p', 0x07,  rtc_time_t)
#define HI_RTC_ALM_READ                _IOR('p', 0x08,  rtc_time_t)
#define HI_RTC_RD_TIME                _IOR('p', 0x09,  rtc_time_t)
#define HI_RTC_SET_TIME                _IOW('p', 0x0a,  rtc_time_t)
#define HI_RTC_RESET                _IOW('p', 0x0b,  rtc_time_t)
#define HI_RTC_REG_SET                _IOW('p', 0x0c,  reg_data_t)
#define HI_RTC_REG_READ                _IOR('p', 0x0d,  reg_data_t)

#define HI_RTC_SET_TEMP_MODE        _IOW('p', 0x0e,  reg_temp_mode_t)
#define HI_RTC_GET_TEMP                    _IOR('p', 0x0f,  char)


int main(int argc, const char *argv[])
{
        rtc_time_t tm;
        reg_data_t regv;
        reg_temp_mode_t mode;
        int ret = -1;
        int fd = -1;
        const char *dev_name = "/dev/hi_rtc";
        char string[50] = {0};

        memset(&tm, 0, sizeof(tm));

        fd = open(dev_name, O_RDWR);
        if (fd < 0) {
                printf("open %s failed\n", dev_name);
                exit(-1);
        }

        unsigned int freq;
        rtc_freq_t value;

        ret = ioctl(fd, HI_RTC_GET_FREQ, &value);
        if (ret < 0)
        {
                printf("get current frequency failed\n");
                exit(-2);
        }

        freq = value.freq_l;

        if (freq > 3277000 || freq < 3276000)
        {
                printf("get invalid freq %d\n", freq);
                exit(-3);
        }
        printf("current frequency : %d\n", freq);

        printf("[RTC_RD_TIME]\n");
        ret = ioctl(fd, HI_RTC_RD_TIME, &tm);
        if (ret < 0)
        {
                printf("ioctl: HI_RTC_RD_TIME failed\n");
                exit(-4);
        }
        struct tm tptr;
        struct timeval tv;

        tptr.tm_year = tm.year - 1900;
        tptr.tm_mon  = tm.month - 1;
        tptr.tm_mday = tm.date;
        tptr.tm_hour = tm.hour;
        tptr.tm_min  = tm.minute;
        tptr.tm_sec  = tm.second;

        tv.tv_sec = mktime(&tptr);
        tv.tv_usec = 0;
        settimeofday(&tv, NULL);

        struct tm *timePassed;
        time_t spentTime;
        while(1)
        {
                sleep(10);
                time(&spentTime);
                timePassed = localtime(&spentTime);
                tm.year    = 1900+timePassed->tm_year;
                tm.month   = 1+timePassed->tm_mon;
                tm.date    = timePassed->tm_mday;
                tm.hour    = timePassed->tm_hour;
                tm.minute  = timePassed->tm_min;
                tm.second  = timePassed->tm_sec;
                tm.weekday = 0;

                ret = ioctl(fd, HI_RTC_SET_TIME, &tm);
                if (ret < 0)
                {
                        printf("ioctl: HI_RTC_SET_TIME failed\n");
                }
        }
        return 0;
}

[/code]

domenor

0个粉丝

17

问答

0

专栏

1

资料

domenor 2017-09-11 10:35:09
认可0
大家早上好呀,能提供一点建议吗,要怎么去让有问题的板不至于死机。
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区