请问:
全志V3S RTC调试出现问题,date命令和hwclock命令得到的时间不一致相差8个小时。无法使用hwclock -w命令写入时间,写不进去。
断电一段时间后,可能会出现下面的情况:
这是什么情况?
求教!
最近编辑记录 yuanlwjt (2019-10-24 09:52:55)
离线
/usr/bin/ntpdate ntp1.aliyun.com && /sbin/hwclock -w >/dev/null 2>&1 做了crond定时,目前调试是隔1分钟从时间服务器更新时间。系统时间更新
后,使用hwclock -w 更新硬件时间,大概一分钟后就不能同步了,差了8个小时,是不是crond间隔时间太短了?
重新上电可能会出现hwclock: RTC_RD_TIME: Operation not permitted 这个错误,不能读取硬件时间。
离线
V3S设备重新上电,会出现hwclock: RTC_RD_TIME: Operation not permitted 这个错误,读不到硬件时钟,但是执行reboot命令重启,这个过程不断电,
hwclock -r就又能正常工作了,很奇怪
离线
我觉得也是这个问题,但不知道去哪里更改时区,尤其是RTC驱动,里面是否有时区设置?
离线
好的,我也再找找,谢谢你了
离线
我试一下
离线
/usr/bin/ntpdate ntp1.aliyun.com && /sbin/hwclock -w -l>/dev/null 2>&1
这样子也不行
离线
V3S上电打印的信息:
[ 1.432392] [RTC] WARNING: Rtc time will be wrong!!
[ 1.438099] sunxi-rtc sunxi-rtc: rtc core: registered sunxi-rtc as rtc0
[ 1.578346] sunxi-rtc sunxi-rtc: hctosys: unable to read the hardware clock
是不是驱动有问题?
离线
我之前也看过一些资料,V3S的RTC好像确实有点问题,别人都用外带的RTC芯片解决问题的。
离线
离线
两个问题都没有找到办法解决
离线
目前就这两个问题,一个问题是时间相差8小时,另一个问题是重新上电无法读取RTC,必须reboot
离线
# devmem 0x01c20414
0x0003250E
这样能读到RTC寄存器的时间
离线
hwclock能读到时间吗
离线
dmesg | grep rtc 打印什么出来?
reboot一下,是否能读到,不要断电
离线
# dmesg | grep rtc
[ 1.438131] sunxi-rtc sunxi-rtc: rtc core: registered sunxi-rtc as rtc0
[ 1.578354] sunxi-rtc sunxi-rtc: hctosys: unable to read the hardware clock
我的是这样的,查看驱动:
err = rtc_read_time(rtc, &tm);
if (err) {
dev_err(rtc->dev.parent,
"hctosys: unable to read the hardware clock\n");
goto err_read;
}
继续跟踪rtc_read_time:
static int __rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm)
{
int err;
if (!rtc->ops)
err = -ENODEV;
else if (!rtc->ops->read_time)
err = -EINVAL;
else {
memset(tm, 0, sizeof(struct rtc_time));
err = rtc->ops->read_time(rtc->dev.parent, tm);
}
return err;
}
int rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm)
{
int err;
err = mutex_lock_interruptible(&rtc->ops_lock);
if (err)
return err;
err = __rtc_read_time(rtc, tm);
mutex_unlock(&rtc->ops_lock);
return err;
}
(!rtc->ops) 这里ops 是结构体变量:
struct rtc_device
{
struct device dev;
struct module *owner;
int id;
char name[RTC_DEVICE_NAME_SIZE];
const struct rtc_class_ops *ops;
...........................
};
struct rtc_class_ops {
int (*open)(struct device *);
void (*release)(struct device *);
int (*ioctl)(struct device *, unsigned int, unsigned long);
int (*read_time)(struct device *, struct rtc_time *);
int (*set_time)(struct device *, struct rtc_time *);
int (*read_alarm)(struct device *, struct rtc_wkalrm *);
int (*set_alarm)(struct device *, struct rtc_wkalrm *);
int (*proc)(struct device *, struct seq_file *);
int (*set_mmss)(struct device *, unsigned long secs);
int (*read_callback)(struct device *, int data);
int (*alarm_irq_enable)(struct device *, unsigned int enabled);
};
ENODEV 19 表示无此设备
EINVAL 22 表示无效的参数
看到这里到底是哪里引起unable to read the hardware clock,还是没找到原因
离线
我试试看
离线
终于解决系统时间和硬件时间差8小时问题,原因是时区造成的。
在我的嵌入式项目中,usr/share下没有/zoneinfo/Asia目录,所以需要从ubuntu系统中拷贝zoneinfo文件夹到嵌入式下usr/share目录下,
并在etc目录下 使用sudo ln -s ../usr/share/zoneinfo/Asia/Shanghai localtime 指定时区为上海并命名为localtime
离线
剩下一个问题,我自己的设备上没有电池,每次上电启动设备,使用hwclock hwclock: RTC_RD_TIME: Operation not permitted就出现这,查了资料,很可能是说linux上电时没有初始化RTC,所以只能带电reboot,再想想还有什么办法可以解决
离线
hwclock 不能设置,不起作用。我这边主要是想上电后通过ntpddate更新系统时间,然后更新硬件时间
离线
yuanlwjt 说:剩下一个问题,我自己的设备上没有电池,每次上电启动设备,使用hwclock hwclock: RTC_RD_TIME: Operation not permitted就出现这,查了资料,很可能是说linux上电时没有初始化RTC,所以只能带电reboot,再想想还有什么办法可以解决
不上电池时间很乱套的,里面的时间可能还比1970年还要小,然后设置系统时间就失败了。不晓得你用的那个版本的linux,新版的linux设置RTC时间是不能小于已经运行时间的。
也就是说,最好外部加电池是吧,我是想通过ntpdate 更新系统时间,然后更新硬件时间
离线
我也好好想了一下,也没必要校准硬件时间,因为我们的设备使用网络同步时间。那这样应该就可以了
离线
设备下,使用ls -al命令,为什么文件夹都是1970年?
离线
这个改不了是吧?
离线
能不能一次性把所有文件的修改时间改掉?
离线
好的,谢谢。我研究一下。顺便问一下,SD能够实现热插拔,目前上电前插入SD卡能识别,能正常读写,但上电后再插入,就不能识别了,也就是不支持热插拔?要实现热插拔具体应该怎么实现?
离线
好的,谢谢。我研究一下
离线
上电后插上SD卡 fdisk -l 有出现sd卡
Device Boot StartCHS EndCHS StartLBA EndLBA Sectors Size
Id Type
/dev/mmcblk0p1 0,32,33 244,227,47 2048 3934207 3932160 1920M
e Win95 FAT16 (LBA)
Partition 1 has different physical/logical start (non-Linux?):
phys=(0,32,33) logical=(0,43,28)
Partition 1 has different physical/logical end:
phys=(244,227,47) logical=(367,30,26)
但 df -h
/dev/mtdblock3 3.0M 484.0K 2.5M 16% /app
没有出现SD卡,我更改脚本挂载到app/sd01 目录下了
离线
想挂载到app/sd01下,该怎么更改脚本?
离线
自动挂载sd卡成功,根据下面网站的经验
https://whycan.cn/t_643.html
由于系统只读
需要在etc/init.d/rcS中添加
chmod 777 /etc/hotplug/insert.sh
chmod 777 /etc/hotplug/remove.sh
更改文件权限即可
离线
在只读文件系统中,不更改权限,设备下面没有权限执行.sh文件。
离线
就是想把文件系统做成只读,这样不容易被别人修改
离线
没有说表达问题,就说之前的问题差不多解决了
离线