一:什么是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],那么我们修改第三个即可:
重新编译即可。