嵌入式修改系统默认时间

一:什么是Linux系统的时钟

       Linux时钟在概念上类似Windows时钟显示当前系统时间,但在时钟分类和设置上却和Windows大相径庭。Linux将时钟分为系统时钟(SystemClock)硬件(Real TimeClock,简称RTC)时钟两种。系统时间是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的那个主板硬件时钟。既然Linux有两个时钟系统,那么大家所使用的Linux默认使用哪种时钟系统呢?会不回出现两种系统时钟冲突的情况呢?这些疑问和担心不无道理。首先,Linux并没有默认哪个时钟系统。当Linux启动时,硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作。
   从Linux启动过程来看,系统时钟和硬件时钟不会发生冲突,但Linux中的所有命令(包括函数)都是采用的系统时钟设置。不仅如此,系统时钟和硬件时钟还可以采用异步方式,即系统时间和硬件时间可以不同。这样做的好处对于普通用户意义不大,但对于Linux网络管理员却有很大的用处。例如,要将一个很大的网络中(跨越若干时区)的服务器同步,假如位于美国纽约的Linux服务器和北京的Linux服务器,其中一台服务器无须改变硬件时钟而只需临时设置一个系统时间,如要将北京服务器上的时间设置为纽约时间,两台服务器完成文件的同步后,再与原来的时钟同步一下即可。这样系统和硬件时钟就提供了更为灵活的操作。

以上文章引自:https://blog.csdn.net/wavemcu/article/details/29375363

如果需要详细了解请点击以上连接。

 

二:这里以全志T717芯片为例,记录如何修改系统时钟

1.查看文件 :linux-3.10/drivers/rtc/rtc-sunxi.h 系统时钟使用的结构体如下:


/*
 * min and max year are arbitrary set considering the limited range of the
 * hardware register field
 */
struct sunxi_rtc_data_year {
        unsigned int min;               /* min year allowed */
        unsigned int max;               /* max year allowed */
        unsigned int mask;              /* mask for the year field */
        unsigned int yshift;            /* bit shift to get the year */
        unsigned char leap_shift;       /* bit shift to get the leap year */
};

2.修改文件:linux-3.10/drivers/rtc/rtc-sunxi.c


static struct sunxi_rtc_data_year data_year_param[] = {
        [0] = {
                .min            = 2010,
                .max            = 2073,
                .mask           = 0x3f,
                .yshift         = 16,
                .leap_shift     = 22,
        },
        [1] = {
                .min            = 1970,
                .max            = 2225,
                .mask           = 0xff,
                .yshift         = 16,
                .leap_shift     = 24,
        },
        [2] = {
                .min            = 2010,
                .max            = 2137,
                .mask           = 0x7f,
                .yshift         = 15,
                .leap_shift     = 22,
        },
        [3] = {
                .min            = 2010,
                .max            = 2137,
                .mask           = 0x7f,
                .yshift         = 16,
                .leap_shift     = 23,
        },
};

以上代码可以看出定义了3组时钟数据,如何确定我们系统使用的哪一组?在该文件中搜索 data_year_param变量如下:


static const struct of_device_id sunxi_rtc_dt_ids[] = {
        { .compatible = "allwinner,sun4i-a10-rtc", .data = &data_year_param[0] },
        { .compatible = "allwinner,sun7i-a20-rtc", .data = &data_year_param[1] },
        { .compatible = "allwinner,sun8iw5-rtc", .data = &data_year_param[0] },
        { .compatible = "allwinner,sun8iw10-rtc", .data = &data_year_param[2] },
        { .compatible = "allwinner,sun8iw11p1-rtc", .data = &data_year_param[3] },
        { .compatible = "allwinner,sun8iw17-rtc", .data = &data_year_param[3] },
        { .compatible = "allwinner,sun50i-rtc", .data = &data_year_param[0] },
        { .compatible = "allwinner,sun50iw3-rtc", .data = &data_year_param[3] },
        { .compatible = "allwinner,sun50iw6-rtc", .data = &data_year_param[3] },
        { /* sentinel */ },
};

然后查找自己开发板的CPU硬件型号(此处描述可能不准确)。执行:

# cat /proc/cpuinfo
可以看到如下信息:

由上图可以看到是:sun8iw17,然后去结构体里面找,如下图:

可以看到是data_year_param[3],那么我们修改第三个即可:

 重新编译即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liu-Eleven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值