uboot一般不会要求开启rtc,只是还是支持rtc以备特殊需求的。

底层驱动移植前面两篇已经介绍。这里介绍顶层的调用过程。顶层在uboot/common/cmd_date.c

/*

* (C) Copyright 2001

* Wolfgang Denk, DENX Software Engineering, wd@denx.de.

*

* See file CREDITS for list of people who contributed to this

* project.

*

* This program is free software; you can redistribute it and/or

* modify it under the terms of the GNU General Public License as

* published by the Free Software Foundation; either version 2 of

* the License, or (at your option) any later version.

*

* This program is distributed in the hope that it will be useful,

* but WITHOUT ANY WARRANTY; without even the implied warranty of

* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

* GNU General Public License for more details.

*

* You should have received a copy of the GNU General Public License

* along with this program; if not, write to the Free Software

* Foundation, Inc., 59 Temple Place, Suite 330, Boston,

* MA 02111-1307 USA

*/

/*

* RTC, Date & Time support: get and set date & time

*/

include

include

include

include

ifdef CONFIG_RELOC_FIXUP_WORKS

define RELOC(a) a

else

define RELOC(a) ((typeof(a))((unsigned long)(a) + gd->reloc_off))

endif

int mk_date (char , struct rtc_time );

int do_date (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])

{

struct rtc_time tm;

int rcode = 0;

int old_bus;

/* switch to correct I2C bus */
old_bus = I2C_GET_BUS();
I2C_SET_BUS(CONFIG_SYS_RTC_BUS_NUM); switch (argc) {
case 2: /* set date & time */
if (strcmp(argv[1],"reset") == 0) {
puts ("Reset RTC...\n");
rtc_reset ();
} else {
/* initialize tm with current time */
rcode = rtc_get (&tm); if(!rcode) {
/* insert new date & time */
if (mk_date (argv[1], &tm) != 0) {
puts ("## Bad date format\n");
break;
}
/* and write to RTC */
rcode = rtc_set (&tm);
if(rcode)
puts("## Set date failed\n");
} else {
puts("## Get date failed\n");
}
}
/* FALL TROUGH */
case 1: /* get date & time */
rcode = rtc_get (&tm); if (rcode) {
puts("## Get date failed\n");
break;
} printf ("Date: %4d-%02d-%02d (%sday) Time: %2d:%02d:%02d\n",
tm.tm_year, tm.tm_mon, tm.tm_mday,
(tm.tm_wday<0 || tm.tm_wday>6) ?
"unknown " : RELOC(weekdays[tm.tm_wday]),
tm.tm_hour, tm.tm_min, tm.tm_sec); break;
default:
cmd_usage(cmdtp);
rcode = 1;
} /* switch back to original I2C bus */
I2C_SET_BUS(old_bus); return rcode;

}

/*

* simple conversion of two-digit string with error checking

*/

static int cnvrt2 (char *str, int *valp)

{

int val;

if ((*str < '0') || (*str > '9'))
return (-1); val = *str - '0'; ++str; if ((*str < '0') || (*str > '9'))
return (-1); *valp = 10 * val + (*str - '0'); return (0);

}

/*

* Convert date string: MMDDhhmm[[CC]YY][.ss]

*

* Some basic checking for valid values is done, but this will not catch

* all possible error conditions.

*/

int mk_date (char *datestr, struct rtc_time *tmp)

{

int len, val;

char *ptr;

ptr = strchr (datestr,'.');
len = strlen (datestr); /* Set seconds */
if (ptr) {
int sec; *ptr++ = '\0';
if ((len - (ptr - datestr)) != 2)
return (-1); len = strlen (datestr); if (cnvrt2 (ptr, &sec))
return (-1); tmp->tm_sec = sec;
} else {
tmp->tm_sec = 0;
} if (len == 12) { /* MMDDhhmmCCYY */
int year, century; if (cnvrt2 (datestr+ 8, &century) ||
cnvrt2 (datestr+10, &year) ) {
return (-1);
}
tmp->tm_year = 100 * century + year;
} else if (len == 10) { /* MMDDhhmmYY */
int year, century; century = tmp->tm_year / 100;
if (cnvrt2 (datestr+ 8, &year))
return (-1);
tmp->tm_year = 100 * century + year;
} switch (len) {
case 8: /* MMDDhhmm */
/* fall thru */
case 10: /* MMDDhhmmYY */
/* fall thru */
case 12: /* MMDDhhmmCCYY */
if (cnvrt2 (datestr+0, &val) ||
val > 12) {
break;
}
tmp->tm_mon = val;
if (cnvrt2 (datestr+2, &val) ||
val > ((tmp->tm_mon==2) ? 29 : 31)) {
break;
}
tmp->tm_mday = val; if (cnvrt2 (datestr+4, &val) ||
val > 23) {
break;
}
tmp->tm_hour = val; if (cnvrt2 (datestr+6, &val) ||
val > 59) {
break;
}
tmp->tm_min = val; /* calculate day of week */
GregorianDay (tmp); return (0);
default:
break;
} return (-1);

}

/*****************************************/

U_BOOT_CMD(

date, 2, 1, do_date,

“get/set/reset date & time”,

“[MMDDhhmm[[CC]YY][.ss]]\ndate reset\n”

” - without arguments: print date & time\n”

” - with numeric argument: set the system date & time\n”

” - with ‘reset’ argument: reset the RTC”

);

这里反向分析:

第一步是注冊 date命令

U_BOOT_CMD(

date, 2, 1, do_date,

“get/set/reset date & time”,

“[MMDDhhmm[[CC]YY][.ss]]\ndate reset\n”

” - without arguments: print date & time\n”

” - with numeric argument: set the system date & time\n”

” - with ‘reset’ argument: reset the RTC”

);

这个命令就是rtc的控制命令了 调用的函数是 do_date

int do_date (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])

能够看到这命令是调用了rtc里面注冊的rtc_reset、rtc_get、rtc_set

分为case1 :获取当年的时间

case2 设置时间;

时间转换函数mk_date 能够将我们输入的字符串转化成为时间的年月日 供rtc_set 配置下去去

uboot中rtc顶层分析的更多相关文章

  1. u-boot中网口处理--软件部分

    u-boot中DM9000驱动分析 1. CSRs和PHY reg读写. static u16 phy_read(int reg) { u16 val; /* Fill the phyxcer reg ...

  2. u-boot中nandflash初始化流程分析(转)

    u-boot中nandflash初始化流程分析(转) 原文地址http://zhuairlunjj.blog.163.com/blog/static/80050945201092011249136/ ...

  3. U-boot中SPL功能和源码流程分析

    在U-boot目录下,有个比较重要的目录就是SPL的,SPL到底是什么呢?为什么要用它呢? SPL(Secondary programloader)是uboot第一阶段执行的代码.主要负责搬移uboo ...

  4. tiny4412 串口驱动分析一 --- u-boot中的串口驱动

    作者:彭东林 邮箱:pengdonglin137@163.com 开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 ...

  5. 为什么要有uboot?带你全面分析嵌入式linux系统启动过程中uboot的作用

    1.为什么要有uboot 1.1.计算机系统的主要部件 (1)计算机系统就是以CPU为核心来运行的系统.典型的计算机系统有:PC机(台式机+笔记本).嵌入式设备(手机.平板电脑.游戏机).单片机(家用 ...

  6. 分析uboot中 make xxx_config过程

    make xxx_config实质上就是调用了 首先看MKCONFIG: [注意]SRCTREE=源文件下的目录 之后的语句: @$(MKCONFIG) $(@:_config=) arm arm92 ...

  7. uboot中setenv和saveenv分析

    转:https://blog.csdn.net/weixin_34355715/article/details/85751477 Env在u-boot中通常有两种存在方式,在永久性存储介质中(flas ...

  8. uboot的配置流程分析

    简单介绍一下uboot的基本配置流程.和绝大多数源码编译安装一样,uboot在执行make之前需要执行make XXXconfig来配置相关信息,而且uboot本身是针对多种平台的bootloader ...

  9. 从0移植uboot (一) _配置分析

    来源:Linux社区  作者:xiaojiang1025  :http://www.linuxidc.com/Linux/2017-02/141018.htm 和绝大多数源码编译安装一样,uboot的 ...

随机推荐

  1. 7.zookeeper集群搭建(windows环境下)

    转自:https://www.cnblogs.com/xuxiuxiu/p/5868481.html 本次zk测试部署版本为3.4.6版本,下载地址http://mirrors.cnnic.cn/ap ...

  2. mysql中配置ssl_key、ssl-cert、ssl-ca的路径及建立ssl连接(适用于5.7以下版本,5.7及以上请看本文末尾的备注)

    1.创建 CA 私钥和 CA 证书 (1)下载并安装openssl,将bin目录配置到环境变量: (2)设置openssl.cfg路径(若不设置会报错,找不到openssl配置文件) \bin\ope ...

  3. 洛谷 P2430 严酷的训练

    P2430 严酷的训练 题目背景 Lj的朋友WKY是一名神奇的少年,在同龄人之中有着极高的地位... 题目描述 他的老师老王对他的程序水平赞叹不已,于是下决心培养这名小子. 老王的训练方式很奇怪,他会 ...

  4. Ten ways to improve the performance of large tables in MySQL--转载

    原文地址:http://www.tocker.ca/2013/10/24/improving-the-performance-of-large-tables-in-mysql.html Today I ...

  5. PythonNET网络编程2

    UDP应用:广播 广播:一点发送,多点接收 广播地址:一个网段内有一个指定的广播地址,是该网段的最大地址 192.168.2.255 广播风暴:一个网络中有大量的广播就会产生广播风暴占用大量带宽,影响 ...

  6. DC中检查脚本错误

    dcprocheck    +     要检查的tcl文件

  7. 【例题 6-17 UVa 10562】Undraw the Trees

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 模拟+递归 [代码] #include <bits/stdc++.h> using namespace std; con ...

  8. Java 学习(18):Java 序列化& 网络编程& 发送邮件

    --Java 序列化 -- 网络编程 -- 发送邮件 Java 序列化 Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据.有关对象的类型的信 ...

  9. 火狐与IE的7个JavaScript差异

    作者注:本篇文章发表于2009.04.27,是一篇关于讨论Javascript在IE6.IE7和FF2+.FF3.0之间的存在的问题的文章. 虽然须要用冗长的JavaScript代码去识别特定的浏览器 ...

  10. TTS-零基础入门之语音模板化

    上篇介绍了TTS的一个简单样例http://blog.csdn.net/u010176014/article/details/47326413 本篇咱们进一步聊聊 语音怎样读模板. 比方 公交车上的模 ...