uboot中可能会有需求提供rtc的支持目的达到uboot启动也能够进行墙上时间的显示和后面推断。大部分rtc支持的一个必要条件就是已经有i2c的支持。由于非常多的rtc是i2c接口控制的。uboot中i2c的移植在前一篇中已经提过。这里就仅仅做rtc的移植。这里选择了经常使用的一款rtc芯片pcf8653来分析。

第一步 开启支持的选项,

uboot/include/configs/mpc5200-common.h这个配置文件里开启了8653这个芯片的支持。

/*

* RTC configuration

*/

define CONFIG_RTC_PCF8563

define CONFIG_SYS_I2C_RTC_ADDR 0x51

这里定义了8653的开启配置和他的i2c的device id

第二步:uboot/drivers/rtc/Makefile

COBJS-$(CONFIG_RTC_PCF8563) += pcf8563.o

确定有这么一条,假设移植里面不存在的你就要自己加入了。

第三步 实现pcf8563.c 这个文件,这个就相当于新建立一个命令。可是这个命令还是uboot做了统一的。这样就能够方便使用者了。

/*

* (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

*/

/*

* Date & Time support for Philips PCF8563 RTC

*/

/* #define DEBUG */

include

include

include

include

if defined(CONFIG_CMD_DATE)

static uchar rtc_read (uchar reg);

static void rtc_write (uchar reg, uchar val);

/* ————————————————————————- */

int rtc_get (struct rtc_time *tmp)

{

int rel = 0;

uchar sec, min, hour, mday, wday, mon_cent, year;

sec = rtc_read (0x02)-0x80;
min = rtc_read (0x03);
hour = rtc_read (0x04);
mday = rtc_read (0x05);
wday = rtc_read (0x06);
mon_cent= rtc_read (0x07);
year = rtc_read (0x08); debug ( "Get RTC year: %02x mon/cent: %02x mday: %02x wday: %02x "
"hr: %02x min: %02x sec: %02x\n",
year, mon_cent, mday, wday,
hour, min, sec );
debug( "Alarms: wday: %02x day: %02x hour: %02x min: %02x\n",
rtc_read (0x0C),
rtc_read (0x0B),
rtc_read (0x0A),
rtc_read (0x09) );

/*

if (sec & 0x80) {

puts (“xu Warning: RTC Low Voltage - date/time not reliable\n”);

rel = -1;

}

*/

tmp->tm_sec = bcd2bin (sec & 0x7F);

tmp->tm_min = bcd2bin (min & 0x7F);

tmp->tm_hour = bcd2bin (hour & 0x3F);

tmp->tm_mday = bcd2bin (mday & 0x3F);

tmp->tm_mon = bcd2bin (mon_cent & 0x1F);

tmp->tm_year = bcd2bin (year) + ((mon_cent & 0x80) ?

2000 : 1900);

tmp->tm_wday = bcd2bin (wday & 0x07);

tmp->tm_yday = 0;

tmp->tm_isdst= 0;

debug( "Get DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",
tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
tmp->tm_hour, tmp->tm_min, tmp->tm_sec); return rel;

}

int rtc_set (struct rtc_time *tmp)

{

uchar century;

debug ( "Set DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",
tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
tmp->tm_hour, tmp->tm_min, tmp->tm_sec); rtc_write (0x08, bin2bcd(tmp->tm_year % 100)); century = (tmp->tm_year >= 2000) ? 0x80 : 0;
rtc_write (0x07, bin2bcd(tmp->tm_mon) | century); rtc_write (0x06, bin2bcd(tmp->tm_wday));
rtc_write (0x05, bin2bcd(tmp->tm_mday));
rtc_write (0x04, bin2bcd(tmp->tm_hour));
rtc_write (0x03, bin2bcd(tmp->tm_min ));
rtc_write (0x02, bin2bcd(tmp->tm_sec )); return 0;

}

void rtc_reset (void)

{

/* clear all control & status registers */
rtc_write (0x00, 0x00);
rtc_write (0x01, 0x00);
rtc_write (0x0D, 0x00); /* clear Voltage Low bit */
rtc_write (0x02, rtc_read (0x02) & 0x7F); /* reset all alarms */
rtc_write (0x09, 0x00);
rtc_write (0x0A, 0x00);
rtc_write (0x0B, 0x00);
rtc_write (0x0C, 0x00);

}

/* ————————————————————————- */

static uchar rtc_read (uchar reg)

{

return (i2c_reg_read (CONFIG_SYS_I2C_RTC_ADDR, reg));

}

static void rtc_write (uchar reg, uchar val)

{

i2c_reg_write (CONFIG_SYS_I2C_RTC_ADDR, reg, val);

}

endif

这俩能够看到

开启CONFIG_CMD_DATE 这个配置

在uboot/include/rtc.h中也是相同对rtc定义了几个标准函数:

int rtc_get (struct rtc_time *);

int rtc_set (struct rtc_time *);

void rtc_reset (void);

void GregorianDay (struct rtc_time *);

void to_tm (int, struct rtc_time *);

unsigned long mktime (unsigned int, unsigned int, unsigned int,

unsigned int, unsigned int, unsigned int);

我们上面的8563文件里也是相应的实现这几个函数。依照标准的參数配置回应标准的数据或者配置。

这里还要关心一个date.c的文件 这个文件实现了date命令unsigned long mktime (unsigned int, unsigned int, unsigned int,

unsigned int, unsigned int, unsigned int);

uboot移植rtc的更多相关文章

  1. u-boot移植 II

    下面是韦老师的uboot移植攻略: A. 开发板的相关拷贝与修改 1. 在board文件夹下面, 将原来的smdk2410复制为100ask24x0目录, 并将smdk2410.c改名为100ask2 ...

  2. 基于mini2440的uboot移植(一)

    一.移植环境 虚拟机:ubuntu12.04 uboot源码:u-boot-2008.10.tar.bz2 交叉编译:arm-linux-gcc-4.4.3 简单的记录下编译uboot的过程,要想具体 ...

  3. 【转】uboot移植(一)BootLoader基本概念

    原文网址:http://blog.chinaunix.net/uid-25445243-id-3869348.html 一.BootLoader简介1.1.嵌入式Linux软件结构与分布 在一般情况下 ...

  4. [学习资料] Tiny210(S5PV210) u-boot移植

    Tiny210(S5PV210) u-boot移植http://www.microoh.com/bbs/forum.php?mod=viewthread&tid=254&fromuid ...

  5. u-boot移植总结(四)u-boot-2010.09框架分析

    (一)本次移植是基于FL2440,板子的基本硬件: CPU 型号为S3C2440,基于ARM920T,指令集ARMV4,时钟主频400MHz SDRAM H57V2562GTR-75C 2片*32MB ...

  6. U-BOOT 移植到友善之臂mini2440

    U-BOOT 移植到友善之臂mini2440 开发环境:ubuntu 10.10 编译器:友善之臂mini2440光盘自带arm-linux-gcc 4.4.3 一. 在denx官网下载源码,我所用版 ...

  7. X-007 FriendlyARM tiny4412 u-boot移植之内存初始化

    <<<<<<<<<<<<<<<<<<<<<<<<< ...

  8. X-004 FriendlyARM tiny4412 uboot移植之点亮指路灯

    <<<<<<<<<<<<<<<<<<<<<<<<< ...

  9. X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件

    X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件 <<<<<<<<<<<<<< ...

随机推荐

  1. linux系统负载状态检查脚本

    为了便于分析问题,编写了一个linux状态检查脚本,脚本可放置任意目录,脚本执行检测后会输出日志记录到当前目录下.直接执行脚本可用于一次检测,可通过日志进行分析.如果需要长时间监测,可执行-x参数,脚 ...

  2. 关于Android应用中图片占用内存浅谈

    从事过移动端应用开发的童鞋应该都清楚,内存是非常宝贵的资源.如果能很好的利用有限的内存,对应用性能的提升会有很大的帮助.在实际应用开发中图片内存占整个应用非常大的比重,我们只有了解图片是如何加载到内存 ...

  3. 低水平选手的自我救赎 (1)CLRS Exercise 16.5-2

    题目大意 给定正整数 $n$ 和一个由 $m$ 个正整数构成的可重集合 $A$,满足 $\forall a\in A, a\le n$ 且 $m\le n$ . 定义 $N_t(A) = |\{a\i ...

  4. POJ 3111 K Best(01分数规划)

    K Best Time Limit: 8000MS   Memory Limit: 65536K Total Submissions: 9876   Accepted: 2535 Case Time ...

  5. 求和为s的连续正数序列

    输入一个正数是s,打印出所有和为s的连续正数序列(至少含有两个数).例如输入15,由于1+2+3+4+5=4+5+6==7+8=15,所有结果打印出3个序列1-5,4-6,7-8. 代码如下: voi ...

  6. http2新特性

    1.二进制分帧   http1.x是文本格式传输,http2二进制格式传输,并且被切分未过个帧发送,帧可以根据头部流标识重新组装.   2. 单一长连接   同一个域名使用一个TCP连接,(http1 ...

  7. web标准,可用性和可访问性

    web标准,简单的说,是指html,css,JavaScript三者的分离. 网页由三部分组成:结构,表现和行为.对应的标准分为三方面: 1.结构化标准语言XHTML和XML2.表现标准语言主要包括c ...

  8. JS 中如何输出空格

    在写JS代码的时候,大家可以会发现这样现象: document.write(" 1 2 3 "); 结果: 无论在输出的内容中什么位置有多少个空格,显示的结果好像只有一个空格. 这 ...

  9. Maven 的基本用法

    一.Maven 的安装 二.Maven的常用构建命令 1.mvn -v 查看maven版本 2.mvn compile 编译 3.mvn test 测试 4.mvn package 打包 5.Mvn  ...

  10. Codeforces 297C. Splitting the Uniqueness

    C. Splitting the Uniqueness time limit per test:1 second memory limit per test:256 megabytes input:s ...