Difference between revisions of "Matrix - RTC"
(Created page with "查看中文") |
|||
Line 1: | Line 1: | ||
[[Matrix - RTC/zh|查看中文]] | [[Matrix - RTC/zh|查看中文]] | ||
+ | |||
+ | ==介绍== | ||
+ | [[File:Matrix-RTC.png|thumb|]] | ||
+ | * | ||
+ | ==特性== | ||
+ | * | ||
+ | [[File:Matrix-RTC_PCB.png|frameless|400px|]] | ||
+ | |||
+ | * 引脚说明: | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | |名称 || 描述 | ||
+ | |- | ||
+ | |SDA || I2C SDA | ||
+ | |- | ||
+ | |SCL || I2C SCL | ||
+ | |- | ||
+ | |5V || 电源5V | ||
+ | |- | ||
+ | |GND || 地 | ||
+ | |} | ||
+ | |||
+ | ==工作原理== | ||
+ | ==下载Matrix源码== | ||
+ | Matrix配件相关的代码是完全开源的,统一由一个仓库进行管理:git://github.com/friendlyarm/matrix.git <br> | ||
+ | 该仓库里不同的分支代表着Matrix配件所支持的不同开发板。<br> | ||
+ | * nanopi分支包含了Matrix对NanoPi的支持; | ||
+ | * tiny4412分支包含了Matrix对Tiny4412的支持; | ||
+ | * raspberrypi分支包含了Matrix对RaspberryPi的支持; | ||
+ | |||
+ | 在主机PC上安装git,以Ubuntu14.04为例 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ sudo apt-get install git | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 克隆Matrix配件代码仓库 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ git clone git://github.com/friendlyarm/matrix.git | ||
+ | </syntaxhighlight> | ||
+ | 克隆完成后会得到一个matrix目录,里面存放着所有Matrix配件的代码。 | ||
+ | |||
+ | ==与NanoPi连接使用== | ||
+ | ===准备工作=== | ||
+ | 在NanoPi上运行Debian系统,然后在主机PC上安装并使用相应的编译器。参考wiki:[[NanoPi/zh|NanoPi]] <br> | ||
+ | 注意:必须使用nanopi-v4.1.y-matrix分支编译出来的内核。<br> | ||
+ | 下载NanoPi内核源代码并编译 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ git clone https://github.com/friendlyarm/linux-4.x.y.git | ||
+ | $ cd linux-4.x.y | ||
+ | $ git checkout nanopi-v4.1.y-matrix | ||
+ | $ make nanopi_defconfig | ||
+ | $ touch .scmversion | ||
+ | $ make | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===硬件连接=== | ||
+ | 参考下图连接模块Matrix-RTC和NanoPi <br> | ||
+ | [[File:Matrix-RTC_nanopi.jpg|frameless|600px|Matrix-RTC_nanopi]] | ||
+ | |||
+ | 连接说明: | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | |Matrix-RTC_nanopi || NanoPi | ||
+ | |- | ||
+ | |SDA || Pin3 | ||
+ | |- | ||
+ | |SCL || Pin5 | ||
+ | |- | ||
+ | |5V || Pin4 | ||
+ | |- | ||
+ | |GND || Pin6 | ||
+ | |} | ||
+ | |||
+ | ===编译测试程序=== | ||
+ | 进入Matrix代码仓库,切换到nanopi分支 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ cd matrix | ||
+ | $ git checkout nanopi | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 编译Matrix配件代码 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ make CROSS_COMPILE=arm-linux- clean | ||
+ | $ make CROSS_COMPILE=arm-linux- | ||
+ | $ make CROSS_COMPILE=arm-linux- install | ||
+ | </syntaxhighlight> | ||
+ | 注意:请确保你的主机PC当前使用的交叉编译器为NanoPi-Debian配套的arm-linux-gcc-4.4.3。<br> | ||
+ | 编译出来的库文件位于install/lib目录下,而测试程序则位于install/usr/bin目录下,模块Matrix-RTC对应的测试程序为matrix-rtc。<br> | ||
+ | |||
+ | ===运行测试程序=== | ||
+ | 拷贝库文件和测试程序到NanoPi的文件系统上 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ cp install/usr/bin/* nanopi_rootfs/usr/bin/ | ||
+ | $ cp install/lib/* nanopi_rootfs/lib/ -d | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 然后启动NanoPi,在Debian的shell终端中执行以下命令加载驱动 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ modprobe rtc-ds1307 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 运行模块Matrix-RTC的测试程序 <br> | ||
+ | 注意:此模块并不支持热插拔,启动系统前需要确保硬件正常连接。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ matrix-rtc | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===代码展示=== | ||
+ | <syntaxhighlight lang="c"> | ||
+ | static const char default_rtc[] = "/dev/rtc0"; | ||
+ | static const char default_date_time[] = "2015 9 15 1 1 1"; | ||
+ | int main(int argc, char **argv) | ||
+ | { | ||
+ | int fd, retval; | ||
+ | struct rtc_time rtc_tm; | ||
+ | const char *rtc = default_rtc; | ||
+ | const char *date_time = default_date_time; | ||
+ | |||
+ | switch (argc) { | ||
+ | case 3: | ||
+ | rtc = argv[1]; | ||
+ | date_time = argv[2]; | ||
+ | break; | ||
+ | case 1: | ||
+ | break; | ||
+ | default: | ||
+ | fprintf(stderr, "usage: rtctest [rtcdev] [year mon day hour min sec]\n"); | ||
+ | return 1; | ||
+ | } | ||
+ | |||
+ | fd = open(rtc, O_RDONLY); | ||
+ | |||
+ | if (fd == -1) { | ||
+ | perror(rtc); | ||
+ | exit(errno); | ||
+ | } | ||
+ | fprintf(stderr, "RTC Driver Test Example.\n"); | ||
+ | |||
+ | sscanf(date_time, "%d %d %d %d %d %d", | ||
+ | &rtc_tm.tm_year, | ||
+ | &rtc_tm.tm_mon, | ||
+ | &rtc_tm.tm_mday, | ||
+ | &rtc_tm.tm_hour, | ||
+ | &rtc_tm.tm_min, | ||
+ | &rtc_tm.tm_sec); | ||
+ | rtc_tm.tm_year -= 1900; | ||
+ | rtc_tm.tm_mon -= 1; | ||
+ | retval = ioctl(fd, RTC_SET_TIME, &rtc_tm); | ||
+ | if (retval == -1) { | ||
+ | perror("RTC_SET_TIME ioctl"); | ||
+ | exit(errno); | ||
+ | } | ||
+ | |||
+ | fprintf(stderr, "Set RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n", | ||
+ | rtc_tm.tm_mon + 1, rtc_tm.tm_mday, rtc_tm.tm_year + 1900, | ||
+ | rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec); | ||
+ | |||
+ | /* Read the RTC time/date */ | ||
+ | retval = ioctl(fd, RTC_RD_TIME, &rtc_tm); | ||
+ | if (retval == -1) { | ||
+ | perror("RTC_RD_TIME ioctl"); | ||
+ | exit(errno); | ||
+ | } | ||
+ | |||
+ | fprintf(stderr, "Read RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n", | ||
+ | rtc_tm.tm_mon + 1, rtc_tm.tm_mday, rtc_tm.tm_year + 1900, | ||
+ | rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec); | ||
+ | |||
+ | fprintf(stderr, "Test complete\n"); | ||
+ | close(fd); | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==与Tiny4412连接使用== | ||
+ | ===准备工作=== | ||
+ | 参考Tiny4412光盘里的《友善之臂Ubuntu使用手册》,在Tiny4412上运行UbuntuCore系统,然后在主机PC上安装并使用相应的编译器。<br> | ||
+ | 注意:只能使用Tiny4412SDK-1506的底板。 | ||
+ | |||
+ | ===硬件连接=== | ||
+ | 参考下图连接模块Matrix-RTC和Tiny4412 <br> | ||
+ | [[File:Matrix-RTC_tiny4412.jpg|frameless|600px|Matrix-RTC_tiny4412]] | ||
+ | |||
+ | 连接说明: | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | |Matrix-RTC || Tiny4412 | ||
+ | |- | ||
+ | |SDA || CON18 SDA | ||
+ | |- | ||
+ | |SCL || CON18 SCL | ||
+ | |- | ||
+ | |5V || CON18 5V | ||
+ | |- | ||
+ | |GND || CON18 GND | ||
+ | |} | ||
+ | |||
+ | ===编译测试程序=== | ||
+ | 进入Matrix代码仓库,切换到tiny4412分支 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ cd matrix | ||
+ | $ git checkout tiny4412 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 编译Matrix配件代码 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ make CROSS_COMPILE=arm-linux-gnueabihf- clean | ||
+ | $ make CROSS_COMPILE=arm-linux-gnueabihf- | ||
+ | $ make CROSS_COMPILE=arm-linux-gnueabihf- install | ||
+ | </syntaxhighlight> | ||
+ | 注意:请确保你的主机PC当前使用的交叉编译器为Tiny4412-UbuntuCore配套的arm-linux-gnueabihf-gcc-4.7.3。<br> | ||
+ | 编译出来的库文件位于install/lib目录下,而测试程序则位于install/usr/bin目录下,模块Matrix-RTC对应的测试程序为matrix-rtc。 | ||
+ | |||
+ | ===运行测试程序=== | ||
+ | 拷贝库文件和测试程序到Tiny4412的UbuntuCore的文件系统上 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ cp install/usr/bin/* tiny4412_rootfs/usr/bin/ | ||
+ | $ cp install/lib/* tiny4412_rootfs/lib/ -d | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 然后启动Tiny4412,在UbuntuCore的shell终端中执行以下命令加载驱动 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ modprobe bmp085-i2c | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 运行模块Matrix-RTC的测试程序 <br> | ||
+ | 注意:此模块并不支持热插拔,启动系统前需要确保硬件正常连接。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ matrix-rtc | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===代码展示=== | ||
+ | <syntaxhighlight lang="c"> | ||
+ | static const char default_rtc[] = "/dev/rtc0"; | ||
+ | static const char default_date_time[] = "2015 9 15 1 1 1"; | ||
+ | int main(int argc, char **argv) | ||
+ | { | ||
+ | int fd, retval; | ||
+ | struct rtc_time rtc_tm; | ||
+ | const char *rtc = default_rtc; | ||
+ | const char *date_time = default_date_time; | ||
+ | |||
+ | switch (argc) { | ||
+ | case 3: | ||
+ | rtc = argv[1]; | ||
+ | date_time = argv[2]; | ||
+ | break; | ||
+ | case 1: | ||
+ | break; | ||
+ | default: | ||
+ | fprintf(stderr, "usage: rtctest [rtcdev] [year mon day hour min sec]\n"); | ||
+ | return 1; | ||
+ | } | ||
+ | |||
+ | fd = open(rtc, O_RDONLY); | ||
+ | |||
+ | if (fd == -1) { | ||
+ | perror(rtc); | ||
+ | exit(errno); | ||
+ | } | ||
+ | fprintf(stderr, "RTC Driver Test Example.\n"); | ||
+ | |||
+ | sscanf(date_time, "%d %d %d %d %d %d", | ||
+ | &rtc_tm.tm_year, | ||
+ | &rtc_tm.tm_mon, | ||
+ | &rtc_tm.tm_mday, | ||
+ | &rtc_tm.tm_hour, | ||
+ | &rtc_tm.tm_min, | ||
+ | &rtc_tm.tm_sec); | ||
+ | rtc_tm.tm_year -= 1900; | ||
+ | rtc_tm.tm_mon -= 1; | ||
+ | retval = ioctl(fd, RTC_SET_TIME, &rtc_tm); | ||
+ | if (retval == -1) { | ||
+ | perror("RTC_SET_TIME ioctl"); | ||
+ | exit(errno); | ||
+ | } | ||
+ | |||
+ | fprintf(stderr, "Set RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n", | ||
+ | rtc_tm.tm_mon + 1, rtc_tm.tm_mday, rtc_tm.tm_year + 1900, | ||
+ | rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec); | ||
+ | |||
+ | /* Read the RTC time/date */ | ||
+ | retval = ioctl(fd, RTC_RD_TIME, &rtc_tm); | ||
+ | if (retval == -1) { | ||
+ | perror("RTC_RD_TIME ioctl"); | ||
+ | exit(errno); | ||
+ | } | ||
+ | |||
+ | fprintf(stderr, "Read RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n", | ||
+ | rtc_tm.tm_mon + 1, rtc_tm.tm_mday, rtc_tm.tm_year + 1900, | ||
+ | rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec); | ||
+ | |||
+ | fprintf(stderr, "Test complete\n"); | ||
+ | close(fd); | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==与RaspberryPi连接使用== | ||
+ | |||
+ | ==与Arduino连接使用== | ||
+ | |||
+ | ==相关资料== | ||
+ | [http://datasheets.maximintegrated.com/en/ds/DS1307.pdf DS1307.pdf] |
Revision as of 08:06, 30 September 2015
Contents
1 介绍
2 特性
- 引脚说明:
名称 | 描述 |
SDA | I2C SDA |
SCL | I2C SCL |
5V | 电源5V |
GND | 地 |
3 工作原理
4 下载Matrix源码
Matrix配件相关的代码是完全开源的,统一由一个仓库进行管理:git://github.com/friendlyarm/matrix.git
该仓库里不同的分支代表着Matrix配件所支持的不同开发板。
- nanopi分支包含了Matrix对NanoPi的支持;
- tiny4412分支包含了Matrix对Tiny4412的支持;
- raspberrypi分支包含了Matrix对RaspberryPi的支持;
在主机PC上安装git,以Ubuntu14.04为例
$ sudo apt-get install git
克隆Matrix配件代码仓库
$ git clone git://github.com/friendlyarm/matrix.git
克隆完成后会得到一个matrix目录,里面存放着所有Matrix配件的代码。
5 与NanoPi连接使用
5.1 准备工作
在NanoPi上运行Debian系统,然后在主机PC上安装并使用相应的编译器。参考wiki:NanoPi
注意:必须使用nanopi-v4.1.y-matrix分支编译出来的内核。
下载NanoPi内核源代码并编译
$ git clone https://github.com/friendlyarm/linux-4.x.y.git $ cd linux-4.x.y $ git checkout nanopi-v4.1.y-matrix $ make nanopi_defconfig $ touch .scmversion $ make
5.2 硬件连接
参考下图连接模块Matrix-RTC和NanoPi
Matrix-RTC_nanopi
连接说明:
Matrix-RTC_nanopi | NanoPi |
SDA | Pin3 |
SCL | Pin5 |
5V | Pin4 |
GND | Pin6 |
5.3 编译测试程序
进入Matrix代码仓库,切换到nanopi分支
$ cd matrix $ git checkout nanopi
编译Matrix配件代码
$ make CROSS_COMPILE=arm-linux- clean $ make CROSS_COMPILE=arm-linux- $ make CROSS_COMPILE=arm-linux- install
注意:请确保你的主机PC当前使用的交叉编译器为NanoPi-Debian配套的arm-linux-gcc-4.4.3。
编译出来的库文件位于install/lib目录下,而测试程序则位于install/usr/bin目录下,模块Matrix-RTC对应的测试程序为matrix-rtc。
5.4 运行测试程序
拷贝库文件和测试程序到NanoPi的文件系统上
$ cp install/usr/bin/* nanopi_rootfs/usr/bin/ $ cp install/lib/* nanopi_rootfs/lib/ -d
然后启动NanoPi,在Debian的shell终端中执行以下命令加载驱动
$ modprobe rtc-ds1307
运行模块Matrix-RTC的测试程序
注意:此模块并不支持热插拔,启动系统前需要确保硬件正常连接。
$ matrix-rtc
5.5 代码展示
static const char default_rtc[] = "/dev/rtc0"; static const char default_date_time[] = "2015 9 15 1 1 1"; int main(int argc, char **argv) { int fd, retval; struct rtc_time rtc_tm; const char *rtc = default_rtc; const char *date_time = default_date_time; switch (argc) { case 3: rtc = argv[1]; date_time = argv[2]; break; case 1: break; default: fprintf(stderr, "usage: rtctest [rtcdev] [year mon day hour min sec]\n"); return 1; } fd = open(rtc, O_RDONLY); if (fd == -1) { perror(rtc); exit(errno); } fprintf(stderr, "RTC Driver Test Example.\n"); sscanf(date_time, "%d %d %d %d %d %d", &rtc_tm.tm_year, &rtc_tm.tm_mon, &rtc_tm.tm_mday, &rtc_tm.tm_hour, &rtc_tm.tm_min, &rtc_tm.tm_sec); rtc_tm.tm_year -= 1900; rtc_tm.tm_mon -= 1; retval = ioctl(fd, RTC_SET_TIME, &rtc_tm); if (retval == -1) { perror("RTC_SET_TIME ioctl"); exit(errno); } fprintf(stderr, "Set RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n", rtc_tm.tm_mon + 1, rtc_tm.tm_mday, rtc_tm.tm_year + 1900, rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec); /* Read the RTC time/date */ retval = ioctl(fd, RTC_RD_TIME, &rtc_tm); if (retval == -1) { perror("RTC_RD_TIME ioctl"); exit(errno); } fprintf(stderr, "Read RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n", rtc_tm.tm_mon + 1, rtc_tm.tm_mday, rtc_tm.tm_year + 1900, rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec); fprintf(stderr, "Test complete\n"); close(fd); return 0; }
6 与Tiny4412连接使用
6.1 准备工作
参考Tiny4412光盘里的《友善之臂Ubuntu使用手册》,在Tiny4412上运行UbuntuCore系统,然后在主机PC上安装并使用相应的编译器。
注意:只能使用Tiny4412SDK-1506的底板。
6.2 硬件连接
参考下图连接模块Matrix-RTC和Tiny4412
Matrix-RTC_tiny4412
连接说明:
Matrix-RTC | Tiny4412 |
SDA | CON18 SDA |
SCL | CON18 SCL |
5V | CON18 5V |
GND | CON18 GND |
6.3 编译测试程序
进入Matrix代码仓库,切换到tiny4412分支
$ cd matrix $ git checkout tiny4412
编译Matrix配件代码
$ make CROSS_COMPILE=arm-linux-gnueabihf- clean $ make CROSS_COMPILE=arm-linux-gnueabihf- $ make CROSS_COMPILE=arm-linux-gnueabihf- install
注意:请确保你的主机PC当前使用的交叉编译器为Tiny4412-UbuntuCore配套的arm-linux-gnueabihf-gcc-4.7.3。
编译出来的库文件位于install/lib目录下,而测试程序则位于install/usr/bin目录下,模块Matrix-RTC对应的测试程序为matrix-rtc。
6.4 运行测试程序
拷贝库文件和测试程序到Tiny4412的UbuntuCore的文件系统上
$ cp install/usr/bin/* tiny4412_rootfs/usr/bin/ $ cp install/lib/* tiny4412_rootfs/lib/ -d
然后启动Tiny4412,在UbuntuCore的shell终端中执行以下命令加载驱动
$ modprobe bmp085-i2c
运行模块Matrix-RTC的测试程序
注意:此模块并不支持热插拔,启动系统前需要确保硬件正常连接。
$ matrix-rtc
6.5 代码展示
static const char default_rtc[] = "/dev/rtc0"; static const char default_date_time[] = "2015 9 15 1 1 1"; int main(int argc, char **argv) { int fd, retval; struct rtc_time rtc_tm; const char *rtc = default_rtc; const char *date_time = default_date_time; switch (argc) { case 3: rtc = argv[1]; date_time = argv[2]; break; case 1: break; default: fprintf(stderr, "usage: rtctest [rtcdev] [year mon day hour min sec]\n"); return 1; } fd = open(rtc, O_RDONLY); if (fd == -1) { perror(rtc); exit(errno); } fprintf(stderr, "RTC Driver Test Example.\n"); sscanf(date_time, "%d %d %d %d %d %d", &rtc_tm.tm_year, &rtc_tm.tm_mon, &rtc_tm.tm_mday, &rtc_tm.tm_hour, &rtc_tm.tm_min, &rtc_tm.tm_sec); rtc_tm.tm_year -= 1900; rtc_tm.tm_mon -= 1; retval = ioctl(fd, RTC_SET_TIME, &rtc_tm); if (retval == -1) { perror("RTC_SET_TIME ioctl"); exit(errno); } fprintf(stderr, "Set RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n", rtc_tm.tm_mon + 1, rtc_tm.tm_mday, rtc_tm.tm_year + 1900, rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec); /* Read the RTC time/date */ retval = ioctl(fd, RTC_RD_TIME, &rtc_tm); if (retval == -1) { perror("RTC_RD_TIME ioctl"); exit(errno); } fprintf(stderr, "Read RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n", rtc_tm.tm_mon + 1, rtc_tm.tm_mday, rtc_tm.tm_year + 1900, rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec); fprintf(stderr, "Test complete\n"); close(fd); return 0; }