imx6ul——uboot添加RTC,pcf8563驱动

博主使用的是天嵌的imx6ul_coreB

一般来说uboot一开始是不支持RTC,可是有时需要在uboot上使用RTC,那么就记录一下如何添加RTC

 

1.添加RTC芯片配置相关

要添加RTC,首先在配置文件中添加宏开启pcf8563芯片的支持,以及RTC的设备地址等,使能date命令并设置RTC设备使用总线号。由于date命令是读取RTC内的时间,所以必须使用相关SOC自带rtc的驱动,或者板上的rtc芯片。具体根据板子情况来决定,TQIMX6UL_COREB使用底板上的rtc芯片。

进入配置文件在I2C configs处添加如下宏定义,添加过程如下:

#vi  include/configs/mx6ul_14x14_evk.h   

#define CONFIG_RTC_PCF8563 //开启RTC的配置

#define CONFIG_SYS_I2C_RTC_ADDR 0x51 //RTC设备地址

#define CONFIG_CMD_DATE //使能date命令

#define CONFIG_SYS_RTC_BUS_NUM 1 //RTC设备使用的总线号

 

2.编译pcf8563驱动

一般原厂的uboot会有各常用芯片的支持,如果没有则需要去网上下载后放入uboot源码。

将RTC文件编译,路径为drivers/rtc/pcf8563.c,确定8563.o编译进去,添加编译过程如下:

#vi drivers/rtc/Makefile

obj-$(CONFIG_RTC_PCF8563) += pcf8563.o //确定有这一条

 

3.配置I2C总线

uboot启动过程中会调用 setup_i2c 函数配置 i2c 总线,在board_init()添加I2C2的配置,board_init()路径为board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c,配置过程如下:

#vi  board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c

setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2); //添加配置I2C2总线

参考I2C1添加函数i2c_pad_info2,如下:

static struct i2c_pads_info i2c_pad_info2 = {

.scl = {

.i2c_mode =  MX6_PAD_CSI_HSYNC__I2C2_SCL | PC,

.gpio_mode = MX6_PAD_CSI_HSYNC__GPIO4_IO20 | PC,

.gp = IMX_GPIO_NR(4, 20),

},

.sda = {

.i2c_mode = MX6_PAD_CSI_VSYNC__I2C2_SDA | PC,

.gpio_mode = MX6_PAD_CSI_VSYNC__GPIO4_IO19 | PC,

.gp = IMX_GPIO_NR(4, 19),

},

};

管脚配置分析如下:

查看核心板原理图,查找I2C2,追溯到核心板,查看i2c2的SDA和SDL线,对应CSI_VSYNC和CSI_HSYNC,即是I2C2的配置管脚,如下图高亮:

imx6ul——uboot添加RTC,pcf8563驱动_第1张图片

打开arch/arm/include/asm/arch-mx6/mx6ul_pins.h查找CSI_VSYNC和CSI_HSYNC,对I2C2进行管脚配置,如下图灰色定义即是I2C2的管脚配置:

imx6ul——uboot添加RTC,pcf8563驱动_第2张图片

 

4.添加date命令

    实现drivers/rtc/pcf8563.c 这个文件,这个文件就相当于新建立date命令,打开pcf8563.c可以看到CONFIG_CMD_DATE这个配置,我们只需在配置文件mx6ul_14x14_evk.h 添加此配置即相当于新建了date命令,如图所示:

imx6ul——uboot添加RTC,pcf8563驱动_第3张图片

date命令则由cmd/date.c实现,我们需要在配置文件mx6ul_14x14_evk.h中配置正确的I2C总线号,具体实现过程可查看源代码,分析如下:

do_date()

  (1) 定义一个rtc_time 的结构体

  (2) 设置正确的i2c总线。(对于使用片上rtc,此处始终返回为0)

  (3) 判断date命令的参数个数。

     如果是一个,则是显示时间,调用rtc_get函数。如果读取失败,则显示错误信息后退出。

     如果是两个,则进一步判断。

        如果是reset,则输出“Reset RTC..."后,调用rtc_reset函数。

        如果不是reset,首先调用ret_get函数获取时间,如果正确,则通过mk_date将date命令的参数转换为rtc_time结构体。最后调用rtc_set函数。

在u-boot中,实现rtc的驱动,只要实现rtc_get, rtc_reset, rtc_set函数即可。

 

5.date命令使用

由于在uboot中添加总线的总线为1,所以在执行命令时需要切换到I2C2(I2C总线从0开始配置,0为I2C1,1为I2C2),date命令不带参数,即为读取rtc时间,并显示成我们可读的格式。date命令带参数,用于设置rtc的时间。

进入uboot命令行,使用如下:

#i2c dev 1 //切换到i2c2总线

#i2c probe //探测该总线下的设备,可以在driver中找到pcf8563的address 0x51

#date reset //复位rtc芯片

#date //读取rtc时间

#date 0719225018 //设置时间 月 日 时 分 年  20180719 22:50

命令使用读取设置时间成功即表示uboot添加RTC成功:

imx6ul——uboot添加RTC,pcf8563驱动_第4张图片

 

你可能感兴趣的:(Linux,c,imx6ul)