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. 【bzoj3630】[JLOI2014]镜面通道 对偶图+计算几何+网络流最小割

    题目描述 在一个二维平面上,有一个镜面通道,由镜面AC,BD组成,AC,BD长度相等,且都平行于x轴,B位于(0,0).通道中有n个外表面为镜面的光学元件,光学元件α为圆形,光学元件β为矩形(这些元件 ...

  2. [canvas入坑1]canvas 画布拖拽效果

    查看效果请到 http://philippica.github.io/  点击drag 和上一篇画图很像,所以有些部分做了省略 当鼠标按下时保存当前画布上的内容到ppImgData中,并且记录下初始点 ...

  3. POJ3207 Ikki's Story IV - Panda's Trick 【2-sat】

    题目 liympanda, one of Ikki's friend, likes playing games with Ikki. Today after minesweeping with Ikk ...

  4. php中memcache扩展及memcached扩展的区别

    1.目前大多数php环境里使用的都是不带d的memcache版本,这个版本出的比较早,是一个原生版本,完全在php框架内开发的.与之对应的带d的memcached是建立在libmemcached的基础 ...

  5. Codeforces Round #316 (Div. 2) B 贪心

    B. Simple Game time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  6. Apache Commons 工具集介绍

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于 ...

  7. pat 团体天梯赛 L1-039. 古风排版

    L1-039. 古风排版 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 中国的古人写文字,是从右向左竖向排版的.本题就请你编写 ...

  8. Entity Framework context per request

    原文发布时间为:2011-09-24 -- 来源于本人的百度文章 [由搬家工具导入] http://www.blog.cyberkinetx.com/2011/05/15/entity-framewo ...

  9. Html.AntiForgeryToken 防止伪造提交

    原文发布时间为:2011-05-03 -- 来源于本人的百度文章 [由搬家工具导入] In this tutorial, I am not going to discuss the concept i ...

  10. 图表插件echars的使用案例

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...