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. JavaScript学习总结(3)——JavaScript函数(function)

    一.函数基本概念 为完成某一功能的程序指令(语句)的集合,称为函数. 二.JavaScript函数的分类 1.自定义函数(我们自己编写的函数),如:function funName(){} 2.系统函 ...

  2. 洛谷 P1610 鸿山洞的灯

    P1610 鸿山洞的灯 题目描述 已知n盏灯以及每盏灯的位置p[i],p[i]均不相等,两盏相邻的灯当小于dist时,若这个安全距离里面还有灯是亮着时,就可以关掉该盏灯,(即若第i-1盏与第i+1盏的 ...

  3. Ubuntu配置sublime text 3的c编译环境

    新建编译系统 c语言 选择tool –> Build System –> New Build System 然后输入下面代码 { "shell_cmd": " ...

  4. jsonp跨域实例丨利用百度数据制作搜索页面

    <!DOCTYPE html><html>    <head>        <meta charset="UTF-8">      ...

  5. Linux体系结构

    linux内核结构: system call interface (SCI层) 为用户空间提供了一套标准的系统调用函数来访问linux内核. process management (PM层) 进程管理 ...

  6. django 简单会议室预约(2)

    --我们先打开settings.py 配置文件: import os #指明django APP目录路径 BASE_DIR = os.path.dirname(os.path.dirname(os.p ...

  7. 洛谷 P2693 [USACO1.3]号码锁 Combination Lock

    P2693 [USACO1.3]号码锁 Combination Lock 题目描述 农夫约翰的奶牛不停地从他的农场中逃出来,导致了很多损害.为了防止它们再逃出来,他买了一只很大的号码锁以防止奶牛们打开 ...

  8. ArcGIS 10.5 新功能

    ArcGIS 10.5正式发布,打造智能的Web GIS平台 2017年新年来临之际,ArcGIS 10.5正式发布. 历经几个版本,ArcGIS10.5已经革新为一个智能的以Web为中心的地理平台, ...

  9. [RxJS] Avoid mulit post requests by using shareReplay()

    With the shareReplay operator in place, we would no longer fall into the situation where we have acc ...

  10. POJ 2236 Wireless Network ||POJ 1703 Find them, Catch them 并查集

    POJ 2236 Wireless Network http://poj.org/problem?id=2236 题目大意: 给你N台损坏的电脑坐标,这些电脑只能与不超过距离d的电脑通信,但如果x和y ...