{"id":959,"date":"2022-09-02T08:17:54","date_gmt":"2022-09-02T08:17:54","guid":{"rendered":"http:\/\/www.recologypower.com:9080\/?p=959"},"modified":"2022-09-02T08:17:55","modified_gmt":"2022-09-02T08:17:55","slug":"%e3%80%90linux%e3%80%91linux%e4%b8%8brtc%e5%ae%9e%e6%97%b6%e6%97%b6%e9%92%9f%e9%a9%b1%e5%8a%a8","status":"publish","type":"post","link":"http:\/\/www.recologypower.com:9080\/?p=959","title":{"rendered":"\u3010Linux\u3011Linux\u4e0bRTC\u5b9e\u65f6\u65f6\u949f\u9a71\u52a8"},"content":{"rendered":"\n<p>1.1 Linux\u4e0bRTC\u65f6\u95f4\u7684\u8bfb\u5199\u5206\u6790<br>1.1.1 \u7cfb\u7edf\u65f6\u95f4\u4e0eRTC\u5b9e\u65f6\u65f6\u949f\u65f6\u95f4<br>Linux\u7cfb\u7edf\u4e0b\u5305\u542b\u4e24\u4e2a\u65f6\u95f4\uff1a\u7cfb\u7edf\u65f6\u95f4\u548cRTC\u65f6\u95f4\u3002<\/p>\n\n\n\n<p>\u7cfb\u7edf\u65f6\u95f4\uff1a\u662f\u7531\u4e3b\u82af\u7247\u7684\u5b9a\u65f6\u5668\u8fdb\u884c\u7ef4\u62a4\u7684\u65f6\u95f4\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u90fd\u4f1a\u9009\u62e9\u82af\u7247\u4e0a\u6700\u9ad8\u7cbe\u5ea6\u7684\u5b9a\u65f6\u5668\u4f5c\u4e3a\u7cfb\u7edf\u65f6\u95f4\u7684\u5b9a\u65f6\u57fa\u51c6\uff0c\u4ee5\u907f\u514d\u5728\u7cfb\u7edf\u8fd0\u884c\u8f83\u957f\u65f6\u95f4\u540e\u51fa\u73b0\u5927\u7684\u65f6\u95f4\u504f\u79fb\u3002\u7279\u70b9\u662f\u6389\u7535\u540e\u4e0d\u4fdd\u5b58\u3002<\/p>\n\n\n\n<p>RTC\u65f6\u95f4\uff1a\u662f\u6307\u7cfb\u7edf\u4e2d\u5305\u542b\u7684RTC\u82af\u7247\u5185\u90e8\u6240\u7ef4\u62a4\u7684\u65f6\u95f4\u3002RTC\u82af\u7247\u90fd\u6709\u7535\u6c60+\u7cfb\u7edf\u7535\u6e90\u7684\u53cc\u91cd\u4f9b\u7535\u673a\u5236\uff0c\u5728\u7cfb\u7edf\u6b63\u5e38\u5de5\u4f5c\u65f6\u7531\u7cfb\u7edf\u4f9b\u7535\uff0c\u5728\u7cfb\u7edf\u6389\u7535\u540e\u7531\u7535\u6c60\u8fdb\u884c\u4f9b\u7535\u3002\u56e0\u6b64\u7cfb\u7edf\u7535\u6e90\u6389\u7535\u540eRTC\u65f6\u95f4\u4ecd\u7136\u80fd\u591f\u6b63\u5e38\u8fd0\u884c\u3002<\/p>\n\n\n\n<p>\u6bcf\u6b21Linux\u7cfb\u7edf\u542f\u52a8\u540e\u5728\u542f\u52a8\u8fc7\u7a0b\u4e2d\u4f1a\u68c0\u6d4b\u548c\u6302\u8f7dRTC\u9a71\u52a8\uff0c\u5728\u6302\u8f7d\u540e\u4f1a\u81ea\u52a8\u4eceRTC\u82af\u7247\u4e2d\u8bfb\u53d6\u65f6\u95f4\u5e76\u8bbe\u7f6e\u5230\u7cfb\u7edf\u65f6\u95f4\u4e2d\u53bb\u3002\u6b64\u540e\u5982\u679c\u6ca1\u6709\u663e\u5f0f\u7684\u901a\u8fc7\u547d\u4ee4\u53bb\u63a7\u5236RTC\u7684\u8bfb\u5199\u64cd\u4f5c\uff0c\u7cfb\u7edf\u5c06\u4e0d\u4f1a\u518d\u4eceRTC\u4e2d\u53bb\u83b7\u53d6\u6216\u8005\u540c\u6b65\u8bbe\u7f6e\u65f6\u95f4\u3002<\/p>\n\n\n\n<p>linux\u547d\u4ee4\u4e2d\u7684date\u548ctime\u7b49\u547d\u4ee4\u90fd\u662f\u7528\u6765\u8bbe\u7f6e\u7cfb\u7edf\u65f6\u95f4\u7684\uff0c\u800chwclock\u547d\u4ee4\u662f\u7528\u6765\u8bbe\u7f6e\u548c\u8bfb\u5199RTC\u65f6\u95f4\u7684\u3002<\/p>\n\n\n\n<p>1.1.2 Linux\u5185\u6838RTC\u5b9e\u65f6\u65f6\u949f\u914d\u7f6e\u67e5\u770b\u4e0e\u9009\u62e9:<br>\u8fdb\u5165\u5230\u5185\u6838\u6839\u76ee\u5f55\u4e0b\uff0c\u8f93\u5165: make menuconfig \u8fdb\u5165\u5230\u5185\u6838\u914d\u7f6e\u83dc\u5355:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Device Drivers  --->\n\n       &#91;*] Real Time Clock  --->\n\n               --- Real Time Clock                                                    \u2502 \u2502 \n\u2502 \u2502    &#91;*]   Set system time from RTC on startup and resume                   \u2502 \u2502 \n\u2502 \u2502    (rtc0)  RTC used to set the system time                                \u2502 \u2502 \n\u2502 \u2502    &#91; ]   RTC debug support                                                \u2502 \u2502 \n\u2502 \u2502          *** RTC interfaces ***                                           \u2502 \u2502 \n\u2502 \u2502    &#91;*]   \/sys\/class\/rtc\/rtcN (sysfs) \n\n   &#91;*]   \/proc\/driver\/rtc (procfs for rtc0)                               \u2502 \u2502 \n\u2502 \u2502    &#91;*]   \/dev\/rtcN (character devices)                                    \u2502 \u2502 \n\u2502 \u2502    &#91; ]     RTC UIE emulation on dev interface                             \u2502 \u2502 \n\u2502 \u2502    &lt; >   Test driver\/device                                               \u2502 \u2502 \n\u2502 \u2502          *** I2C RTC drivers ***                                          \u2502 \u2502 \n\u2502 \u2502    &lt; >   Dallas\/Maxim DS1307\/37\/38\/39\/40, ST M41T00, EPSON RX-8025  \n\n   &lt; >   Dallas\/Maxim DS1374                                              \u2502 \u2502 \n\u2502 \u2502    &lt; >   Dallas\/Maxim DS1672                                              \u2502 \u2502 \n\u2502 \u2502    &lt; >   Dallas\/Maxim DS3232                                              \u2502 \u2502 \n\u2502 \u2502    &lt; >   Maxim MAX6900                                                    \u2502 \u2502 \n\u2502 \u2502    &lt; >   Ricoh R2025S\/D, RS5C372A\/B, RV5C386, RV5C387A\n\n   &lt; >   Intersil ISL1208                                                 \u2502 \u2502 \n\u2502 \u2502    &lt; >   Intersil ISL12022                                                \u2502 \u2502 \n\u2502 \u2502    &lt; >   Xicor\/Intersil X1205                                             \u2502 \u2502 \n\u2502 \u2502    &lt; >   Philips PCF8563\/Epson RTC8564                                    \u2502 \u2502 \n\u2502 \u2502    &lt; >   Philips PCF8583                                                  \u2502 \u2502 \n\u2502 \u2502    &lt; >   ST M41T62\/65\/M41T80\/81\/82\/83\/84\/85\/87    \n\n    &lt; >   TI BQ32000                                                       \u2502 \u2502 \n\u2502 \u2502    &lt; >   Seiko Instruments S-35390A                                       \u2502 \u2502 \n\u2502 \u2502    &lt; >   Ramtron FM3130                                                   \u2502 \u2502 \n\u2502 \u2502    &lt; >   Epson RX-8581                                                    \u2502 \u2502 \n\u2502 \u2502    &lt; >   Epson RX-8025SA\/NB                                               \u2502 \u2502 \n\u2502 \u2502    &lt; >   EM Microelectronic EM3027\n\n   &lt; >   Micro Crystal RTC                                                \u2502 \u2502 \n\u2502 \u2502          *** SPI RTC drivers ***                                          \u2502 \u2502 \n\u2502 \u2502    &lt; >   ST M41T93                                                        \u2502 \u2502 \n\u2502 \u2502    &lt; >   ST M41T94                                                        \u2502 \u2502 \n\u2502 \u2502    &lt; >   Dallas\/Maxim DS1305\/DS1306                                       \u2502 \u2502 \n\u2502 \u2502    &lt; >   Dallas\/Maxim DS1390\/93\/94\n\n         *** Platform RTC drivers ***                                     \u2502 \u2502 \n\u2502 \u2502    &lt; >   PC-style 'CMOS'                                                  \u2502 \u2502 \n\u2502 \u2502    &lt; >   Dallas DS1286                                                    \u2502 \u2502 \n\u2502 \u2502    &lt; >   Dallas DS1511                                                    \u2502 \u2502 \n\u2502 \u2502    &lt; >   Maxim\/Dallas DS1553   \n\n        *** on-CPU RTC drivers ***                                       \u2502 \u2502 \n\u2502 \u2502    &lt;*>   Samsung S3C series SoC RTC                                       \u2502 \u2502 \n\u2502 \u2502    &lt; >   ARM AMBA PL030 RTC                                               \u2502 \u2502 \n\u2502 \u2502    &lt; >   ARM AMBA PL031 RTC                                               \u2502 \u2502 <\/code><\/pre>\n\n\n\n<p>\u6839\u636e\u5185\u6838\u7684\u914d\u7f6e\u5f97\u77e53\u4e2a\u4fe1\u606f(\u7ea2\u8272\u9009\u4e2d\u7684\u914d\u7f6e\u9009\u9879):<\/p>\n\n\n\n<ol><li>\u7cfb\u7edf\u65f6\u95f4\u9ed8\u8ba4\u4eceRTC0\u91cc\u83b7\u53d6\u65f6\u95f4\u8fdb\u884c\u8bbe\u7f6e\u3002<\/li><\/ol>\n\n\n\n<p>(rtc0\u8868\u793a\/dev\u4e0b\u7b2c\u4e00\u4e2artc\u9a71\u52a8,\u5982\u679c\u5b89\u88c5\u4e86\u7b2c\u4e8c\u4e2aRTC\u9a71\u52a8\uff0c\u5c31\u4ee5rtc1\u8868\u793a\uff0c\u4f9d\u6b21\u7c7b\u63a8)<\/p>\n\n\n\n<ol start=\"2\"><li>\u4f7f\u7528proc\u67e5\u770bRTC\u4fe1\u606f\uff0c\u9ed8\u8ba4\u53ea\u80fd\u4ecertc0\u8282\u70b9\u91cc\u83b7\u53d6(\u7cfb\u7edf\u91cc\u7684\u7b2c\u4e00\u4e2artc\u9a71\u52a8)<\/li><\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"644\" height=\"472\" src=\"http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/20210924231903933.png\" alt=\"\" class=\"wp-image-960\" srcset=\"http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/20210924231903933.png 644w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/20210924231903933-300x220.png 300w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/20210924231903933-600x440.png 600w\" sizes=\"(max-width: 644px) 100vw, 644px\" \/><\/figure>\n\n\n\n<ol start=\"3\"><li>\u5185\u6838\u9ed8\u8ba4\u9009\u62e9CPU\u672c\u8eab\u81ea\u5e26\u7684RTC\u4f5c\u4e3a\u7cfb\u7edf\u5b9e\u65f6\u65f6\u949f\u3002<\/li><\/ol>\n\n\n\n<p>\u9a71\u52a8\u6e90\u7801\\linux-3.5\\drivers\\rtc\\ rtc-s3c.c\u662f\u4e09\u661f\u516c\u53f8\u7f16\u5199\u7684RTC\u9a71\u52a8\u3002<\/p>\n\n\n\n<p>1.1.3 date\u547d\u4ee4\u4f7f\u7528\u4ecb\u7ecd<br>date\u662f\u7528\u6765\u663e\u793a\u6216\u8bbe\u5b9a\u7cfb\u7edf\u7684\u65e5\u671f\u4e0e\u65f6\u95f4\u7684\u547d\u4ee4\u3002<\/p>\n\n\n\n<p>\u547d\u4ee4\u4f7f\u7528\u683c\u5f0f: date [\u53c2\u6570]\u2026 [+\u683c\u5f0f]<\/p>\n\n\n\n<p>\u547d\u4ee4\u53ef\u4ee5\u7684\u53c2\u6570\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u4f7f\u7528\u793a\u4f8b\uff1a date '+%A'\n\n\u5fc5\u8981\u53c2\u6570:\n\n%H \u5c0f\u65f6(\u4ee500-23\u6765\u8868\u793a)\u3002\n\n%I \u5c0f\u65f6(\u4ee501-12\u6765\u8868\u793a)\u3002\n\n%K \u5c0f\u65f6(\u4ee50-23\u6765\u8868\u793a)\u3002\n\n%l \u5c0f\u65f6(\u4ee50-12\u6765\u8868\u793a)\u3002\n\n%M \u5206\u949f(\u4ee500-59\u6765\u8868\u793a)\u3002\n\n%P AM\u6216PM\u3002\n\n%r \u65f6\u95f4(\u542b\u65f6\u5206\u79d2\uff0c\u5c0f\u65f6\u4ee512\u5c0f\u65f6AM\/PM\u6765\u8868\u793a)\u3002\n\n%s \u603b\u79d2\u6570\u3002\u8d77\u7b97\u65f6\u95f4\u4e3a1970-01-01 00:00:00 UTC\u3002\n\n%S \u79d2(\u4ee5\u672c\u5730\u7684\u60ef\u7528\u6cd5\u6765\u8868\u793a)\u3002\n\n%T \u65f6\u95f4(\u542b\u65f6\u5206\u79d2\uff0c\u5c0f\u65f6\u4ee524\u5c0f\u65f6\u5236\u6765\u8868\u793a)\u3002\n\n%X \u65f6\u95f4(\u4ee5\u672c\u5730\u7684\u60ef\u7528\u6cd5\u6765\u8868\u793a)\u3002\n\n%Z \u5e02\u533a\u3002\n\n%a \u661f\u671f\u7684\u7f29\u5199\u3002\n\n%A \u661f\u671f\u7684\u5b8c\u6574\u540d\u79f0\u3002\n\n%b \u6708\u4efd\u82f1\u6587\u540d\u7684\u7f29\u5199\u3002\n\n%B \u6708\u4efd\u7684\u5b8c\u6574\u82f1\u6587\u540d\u79f0\u3002\n\n%c \u65e5\u671f\u4e0e\u65f6\u95f4\u3002\u53ea\u8f93\u5165date\u6307\u4ee4\u4e5f\u4f1a\u663e\u793a\u540c\u6837\u7684\u7ed3\u679c\u3002\n\n%d \u65e5\u671f(\u4ee501-31\u6765\u8868\u793a)\u3002\n\n%D \u65e5\u671f(\u542b\u5e74\u6708\u65e5)\u3002\n\n%j \u8be5\u5e74\u4e2d\u7684\u7b2c\u51e0\u5929\u3002\n\n%m \u6708\u4efd(\u4ee501-12\u6765\u8868\u793a)\u3002\n\n%U \u8be5\u5e74\u4e2d\u7684\u5468\u6570\u3002\n\n%w \u8be5\u5468\u7684\u5929\u6570\uff0c0\u4ee3\u8868\u5468\u65e5\uff0c1\u4ee3\u8868\u5468\u4e00\uff0c\u5f02\u8bcd\u7c7b\u63a8\u3002\n\n%x \u65e5\u671f(\u4ee5\u672c\u5730\u7684\u60ef\u7528\u6cd5\u6765\u8868\u793a)\u3002\n\n%y \u5e74\u4efd(\u4ee500-99\u6765\u8868\u793a)\u3002\n\n%Y \u5e74\u4efd(\u4ee5\u56db\u4f4d\u6570\u6765\u8868\u793a)\u3002\n\n%n \u5728\u663e\u793a\u65f6\uff0c\u63d2\u5165\u65b0\u7684\u4e00\u884c\u3002\n\n%t \u5728\u663e\u793a\u65f6\uff0c\u63d2\u5165tab\u3002\n\nMM \u6708\u4efd(\u5fc5\u8981)\n\nDD \u65e5\u671f(\u5fc5\u8981)\n\nhh \u5c0f\u65f6(\u5fc5\u8981)\n\nmm \u5206\u949f(\u5fc5\u8981)\n\nss \u79d2(\u9009\u62e9\u6027)\n\n\u9009\u62e9\u53c2\u6570:\n\n-d&lt;\u5b57\u7b26\u4e32> \u3000\u663e\u793a\u5b57\u7b26\u4e32\u6240\u6307\u7684\u65e5\u671f\u4e0e\u65f6\u95f4\u3002\u5b57\u7b26\u4e32\u524d\u540e\u5fc5\u987b\u52a0\u4e0a\u53cc\u5f15\u53f7\u3002\n\n-s&lt;\u5b57\u7b26\u4e32> \u3000\u6839\u636e\u5b57\u7b26\u4e32\u6765\u8bbe\u7f6e\u65e5\u671f\u4e0e\u65f6\u95f4\u3002\u5b57\u7b26\u4e32\u524d\u540e\u5fc5\u987b\u52a0\u4e0a\u53cc\u5f15\u53f7\u3002\n\n-u \u3000\u663e\u793aGMT\u3002\n\n--help \u3000\u5728\u7ebf\u5e2e\u52a9\u3002\n\n--version \u3000\u663e\u793a\u7248\u672c\u4fe1\u606f<\/code><\/pre>\n\n\n\n<p><strong>\u7cfb\u7edf\u65f6\u95f4\u7684\u65b9\u5f0f<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;root@XiaoLong \/]# date -s \"2018-07-28 14:21:22\"  \/\/\u8bbe\u7f6e\u5168\u90e8\u65e5\u671f\u4e0e\u65f6\u95f4\n\n&#91;root@XiaoLong \/]# date -s \"14:30:22\"    \/\/\u53ea\u8bbe\u7f6e\u65f6\u95f4\n\n&#91;root@XiaoLong \/]# date -s \"2017-07-28\"  \/\/\u8bbe\u7f6e\u65e5\u671f\uff0c\u65f6\u95f4\u9ed8\u8ba4\u4e3a00:00:00<\/code><\/pre>\n\n\n\n<p><strong>\u683c\u5f0f\u793a\u4f8b<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;root@XiaoLong \/]# date -r app      \/\/ -r\u9009\u9879\u53ef\u4ee5\u6253\u5370\u51fa\u6307\u5b9a\u6587\u4ef6\u7684\u6700\u540e\u4fee\u6539\u65f6\u95f4\n\nFri Apr 29 05:17:34 UTC 2016\n\n&#91;root@XiaoLong \/]# date -d 23:39:00  \/\/\u6253\u5370\u51fa\u6307\u5b9a\u683c\u5f0f\u65f6\u95f4\uff08\u53ea\u662f\u6253\u5370\u6548\u679c\u6ca1\u6709\u5176\u4ed6\u6548\u679c\uff09\n\nSat Apr 30 23:39:00 UTC 2016\n\n&#91;root@XiaoLong \/]# date -s 12:20:30  \/\/\u8bbe\u7f6e\u7cfb\u7edf\u65f6\u95f4\u4e3a12\u70b920\u520630\u79d2\n\nSat Apr 30 12:20:30 UTC 2016\n\n&#91;root@XiaoLong \/]# date -s 2016.04.30-23:20:10  \/\/\u8bbe\u7f6e\u7cfb\u7edf\u65f6\u95f4\u4e3a2016\u5e744\u670830\u65e523\u70b920\u520610\u79d2\n\nSat Apr 30 23:20:10 UTC 2016<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">1.1.4&nbsp;<strong>\u7cfb\u7edfRTC\u5b9e\u65f6\u65f6\u949f\u65f6\u95f4\u7684\u83b7\u53d6\u4e0e\u8bbe\u7f6e<\/strong><\/h2>\n\n\n\n<p><strong>1. \u5c06RTC\u65f6\u95f4\u540c\u6b65\u5230\u7cfb\u7edf\u65f6\u95f4<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;root@XiaoLong \/]# hwclock -s<\/code><\/pre>\n\n\n\n<p>\u4e3a\u4e86\u5728\u542f\u52a8\u65f6\u81ea\u52a8\u6267\u884cRTC\u65f6\u95f4\u540c\u6b65\u5230\u7cfb\u7edf\u65f6\u95f4\uff0c\u53ef\u4ee5\u628ahwclock -s\u547d\u4ee4\u52a0\u5165\u5230profile\u6216\u8005rcS\u6587\u4ef6\u4e2d\u3002<\/p>\n\n\n\n<p><strong>2. \u83b7\u53d6\u663e\u793aRTC\u65f6\u95f4<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;root@XiaoLong \/]# hwclock -r\r\n\r\nSun May  1 00:09:36 2016  0.000000 seconds<\/code><\/pre>\n\n\n\n<ol start=\"3\"><li>\u5c06\u7cfb\u7edf\u65f6\u95f4\u540c\u6b65\u5230RTC\uff0c\u7528\u4e8e\u8bbe\u7f6e\u65f6\u95f4<\/li><\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;root@XiaoLong \/]# hwclock -w<\/code><\/pre>\n\n\n\n<p><strong><strong>4. \u67e5\u770bRTC\u7684\u4fe1\u606f<\/strong><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;root@XiaoLong \/]# cat \/proc\/driver\/rtc\n\nrtc_time        : 00:09:27\n\nrtc_date        : 2016-05-01\n\nalrm_time       : 23:24:07\n\nalrm_date       : 2016-05-01\n\nalarm_IRQ       : no\n\nalrm_pending    : no\n\nupdate IRQ enabled      : no\n\nperiodic IRQ enabled    : no\n\nperiodic IRQ frequency  : 1\n\nmax user IRQ frequency  : 32768\n\n24hr            : yes\n\nperiodic_IRQ    : no<\/code><\/pre>\n\n\n\n<p>1.2 Linux\u5185\u6838RTC\u5b50\u7cfb\u7edf\u7ed3\u6784<br>1.2.1 RTC\u6846\u67b6\u76f8\u5173\u7684\u6838\u5fc3\u6587\u4ef6<\/p>\n\n\n\n<ol><li>\/drivers\/rtc\/class.c \u8fd9\u4e2a\u6587\u4ef6\u5411linux\u8bbe\u5907\u6a21\u578b\u6838\u5fc3\u6ce8\u518c\u4e86\u4e00\u4e2a\u7c7bRTC\uff0c\u7136\u540e\u5411\u9a71\u52a8\u7a0b\u5e8f\u63d0\u4f9b\u4e86\u6ce8\u518c\/\u6ce8\u9500\u63a5\u53e3<\/li><li>\/drivers\/rtc\/rtc-dev.c \u8fd9\u4e2a\u6587\u4ef6\u5b9a\u4e49\u4e86\u57fa\u672c\u7684\u8bbe\u5907\u6587\u4ef6\u64cd\u4f5c\u51fd\u6570\uff0c\u5982\uff1aopen,read\u7b49<\/li><li>\/drivers\/rtc\/interface.c \u987e\u540d\u601d\u4e49\uff0c\u8fd9\u4e2a\u6587\u4ef6\u4e3b\u8981\u63d0\u4f9b\u4e86\u7528\u6237\u7a0b\u5e8f\u4e0eRTC\u9a71\u52a8\u7684\u63a5\u53e3\u51fd\u6570\uff0c\u7528\u6237\u7a0b\u5e8f\u4e00\u822c\u901a\u8fc7ioctl\u4e0eRTC\u9a71\u52a8\u4ea4\u4e92\uff0c\u8fd9\u91cc\u5b9a\u4e49\u4e86\u6bcf\u4e2aioctl\u547d\u4ee4\u9700\u8981\u8c03\u7528\u7684\u51fd\u6570<\/li><li>\/drivers\/rtc\/rtc-sysfs.c \u4e0esysfs\u6709\u5173<\/li><li>\/drivers\/rtc\/rtc-proc.c \u4e0eproc\u6587\u4ef6\u7cfb\u7edf\u6709\u5173<\/li><li>\/include\/linux\/rtc.h \u5b9a\u4e49\u4e86\u4e0eRTC\u6709\u5173\u7684\u6570\u636e\u7ed3\u6784<\/li><\/ol>\n\n\n\n<p>Linux\u5185\u6838\u6e90\u7801\u81ea\u5e26\u7684RTC\u9a71\u52a8\u4ee3\u7801\u5b58\u653e\u4f4d\u7f6e\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\\linux-3.5\\drivers\\rtc\\\u76ee\u5f55\u4e0b\u5168\u662fRTC\u9a71\u52a8\u793a\u4f8b\u4ee3\u7801\r\n\r\n\u5176\u4e2d\uff1artc-s3c.c \u662f\u4e09\u661f\u516c\u53f8\u7f16\u5199\u7684RTC\u9a71\u52a8<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">1.2.2 \u5185\u6838\u63d0\u4f9b\u7684rtc\u5e95\u5c42\u6ce8\u518c\u4e0e\u6ce8\u9500\u51fd\u6570<\/h2>\n\n\n\n<p><strong>1. RTC\u6846\u67b6\u6ce8\u518c\u51fd\u6570<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>struct rtc_device *rtc_device_register(\n\nconst char *name,  \/\/RTC\u65f6\u949f\u540d\u79f0\n\nstruct device *dev,  \/\/\u8bbe\u5907\u6307\u9488\u3002\u8be5\u6307\u9488\u9700\u8981\u9700\u8981\u901a\u8fc7\u5e73\u53f0\u8bbe\u5907\u83b7\u53d6\u3002\n\n                                   const struct rtc_class_ops *ops, \/\/rtc\u6587\u4ef6\u64cd\u4f5c\u96c6\u5408\n\n                                   struct module *owner)  \/\/\u9a71\u52a8\u6240\u6709\u8005\u3002\u586b: THIS_MODULE<\/code><\/pre>\n\n\n\n<p>\u4f7f\u7528\u793a\u4f8b: rtc_device_register(&#8220;tiny4412_rtc&#8221;,&amp;pdev-&gt;dev, &amp;tiny4412_rtcops,THIS_MODULE);<\/p>\n\n\n\n<p>\u4f7f\u7528rtc_device_register\u51fd\u6570\u6ce8\u518c\u6210\u529f\u4e4b\u540e\uff0c\u5728\/dev\/\u4e0b\u53ef\u4ee5\u770b\u5230rtcx\u7684\u8bbe\u5907\u8282\u70b9(x\u662frtc\u7684\u987a\u5e8f\u7f16\u53f7)\u3002<\/p>\n\n\n\n<p><strong>2. RTC\u6846\u67b6\u6ce8\u9500\u51fd\u6570<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void rtc_device_unregister(struct rtc_device *rtc)<\/code><\/pre>\n\n\n\n<p>\u7ecf\u8fc7RTC\u6ce8\u518c\u51fd\u6570\u5f62\u53c2\u5206\u6790\uff0cRTC\u5b50\u7cfb\u7edf\u7684\u6ce8\u518c\u9700\u8981\u901a\u8fc7\u5e73\u53f0\u8bbe\u5907\u6846\u67b6\u5b8c\u6210\uff0c\u5728\u5e73\u53f0\u8bbe\u5907\u7684\u9a71\u52a8\u7aef\u7684probe\u51fd\u6570\u91cc\u8fdb\u884crtc\u6ce8\u518c\uff0cremove\u51fd\u6570\u91cc\u8fdb\u884c\u6ce8\u9500\uff0c\u5728rtc\u8bbe\u5907\u7aef\u5411\u9a71\u52a8\u7aef\u4f20\u9012RTC\u786c\u4ef6\u9700\u8981\u7684\u4e00\u4e9b\u4fe1\u606f\u3002<\/p>\n\n\n\n<p>1.2.3 \u6587\u4ef6\u64cd\u4f5c\u96c6\u5408\u63a5\u53e3<br>rtc_class_ops \u8fd9\u4e2a\u7ed3\u6784\u662fRTC\u9a71\u52a8\u7a0b\u5e8f\u8981\u5b9e\u73b0\u7684\u57fa\u672c\u64cd\u4f5c\u51fd\u6570\u3002\u9a71\u52a8\u7a0b\u5e8f\u901a\u8fc7\u521d\u59cb\u5316\u8fd9\u6837\u4e00\u4e2a\u7ed3\u6784\uff0c\u5c06\u81ea\u5df1\u5b9e\u73b0\u7684\u51fd\u6570\u4e0eRTC\u6838\u5fc3\u8054\u7cfb\u8d77\u6765\u3002\u8fd9\u91cc\u9762\u7684\u5927\u90e8\u5206\u51fd\u6570\u90fd\u8981\u9a71\u52a8\u7a0b\u5e8f\u6765\u5b9e\u73b0\u3002\u800c\u4e14\u8fd9\u4e9b\u51fd\u6570\u90fd\u662f\u64cd\u4f5c\u5e95\u5c42\u786c\u4ef6\u7684\uff0c\u5c5e\u4e8e\u6700\u5e95\u5c42\u7684\u51fd\u6570\u3002\u8fd9\u4e2a\u9a71\u52a8\u63a5\u53e3\u4e0e\u5e94\u7528\u5c42\u7684hwclock\u547d\u4ee4\u5173\u8054\u5728\u4e00\u8d77\uff0c\u53ef\u4ee5\u901a\u8fc7hwclock\u547d\u4ee4\u8c03\u7528\u5e95\u5c42RTC\u8fd9\u4e9b\u51fd\u6570\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>struct rtc_class_ops {\n\n       int (*open)(struct device *);  \/\/\u6253\u5f00\n\n       void (*release)(struct device *);\n\n       int (*ioctl)(struct device *, unsigned int, unsigned long);   \/*ioctl\u51fd\u6570*\/\n\n       int (*read_time)(struct device *, struct rtc_time *);   \/\/\u8bfb\u53d6\u65f6\u95f4\n\n       int (*set_time)(struct device *, struct rtc_time *);    \/\/\u8bbe\u7f6e\u65f6\u95f4\n\n       int (*read_alarm)(struct device *, struct rtc_wkalrm *);  \/\/\u8bfb\u53d6\u95f9\u949f\n\n       int (*set_alarm)(struct device *, struct rtc_wkalrm *);   \/\/\u8bbe\u7f6e\u95f9\u949f\n\n       int (*proc)(struct device *, struct seq_file *);          \/\/proc\u63a5\u53e3\n\n       int (*set_mmss)(struct device *, unsigned long secs);    \/\/\u8bbe\u7f6e\u79d2\u5355\u4f4d\n\n       int (*read_callback)(struct device *, int data);          \/\/\u56de\u8c03\u51fd\u6570\n\n       int (*alarm_irq_enable)(struct device *, unsigned int enabled);  \/\/\u95f9\u949f\u4e2d\u65ad\u4f7f\u80fd\n\n};<\/code><\/pre>\n\n\n\n<p>RTC\u5b50\u7cfb\u7edf\u91cc\u9a71\u52a8\u4e00\u822c\u53ea\u9700\u8981\u5b9e\u73b0\u8bbe\u7f6e\u65f6\u95f4\u548c\u83b7\u53d6\u65f6\u95f4\u7684\u51fd\u6570\u63a5\u53e3\u5373\u53ef\uff0c\u7528\u6237\u53ef\u4ee5\u5728\u5e94\u7528\u5c42\u901a\u8fc7ioctl\u51fd\u6570\u4f20\u5165\u5bf9\u5e94\u7684\u547d\u4ee4\u8c03\u7528\u9a71\u52a8\u5c42\u7684\u63a5\u53e3\uff0c\u5b9e\u73b0\u65f6\u95f4\u83b7\u53d6\u4e0e\u8bbe\u7f6e\u3002<\/p>\n\n\n\n<p><strong>\u5e38\u7528\u7684\u4e24\u4e2a\u547d\u4ee4\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#define RTC_RD_TIME               _IOR(RTC_MAGIC, 0x09, struct rtc_time)  \/* Read RTC time. *\/\n\n#define RTC_SET_TIME             _IOW(RTC_MAGIC, 0x0a, struct rtc_time) \/* Set RTC time. *\/\n\n\/\/\u652f\u6301\u7684\u5168\u90e8\u547d\u4ee4 \u5728interface.c\u6587\u4ef6\u4e2d\u6709\u4f7f\u7528\u8303\u4f8b\u3002 \u8fd9\u4e9b\u547d\u4ee4\u5728\u7528\u6237\u81ea\u5df1\u5199\u5e94\u7528\u5c42\u4ee3\u7801\u65f6\u53ef\u4ee5\u7528\u5230\n\nRTC_ALM_READ                     rtc_read_alarm        \u8bfb\u53d6\u95f9\u949f\u65f6\u95f4\n\nRTC_ALM_SET                      rtc_set_alarm          \u8bbe\u7f6e\u95f9\u949f\u65f6\u95f4\n\nRTC_RD_TIME                      rtc_read_time          \u8bfb\u53d6\u65f6\u95f4\u4e0e\u65e5\u671f\n\nRTC_SET_TIME                     rtc_set_time            \u8bbe\u7f6e\u65f6\u95f4\u4e0e\u65e5\u671f\n\nRTC_PIE_ON RTC_PIE_OFF           rtc_irq_set_state         \u5f00\u5173RTC\u5168\u5c40\u4e2d\u65ad\u7684\u51fd\u6570\n\nRTC_AIE_ON RTC_AIE_OFF           rtc_alarm_irq_enable     \u4f7f\u80fd\u7981\u6b62RTC\u95f9\u949f\u4e2d\u65ad\n\nRTC_UIE_OFF RTC_UIE_ON           rtc_update_irq_enable    \u4f7f\u80fd\u7981\u6b62RTC\u66f4\u65b0\u4e2d\u65ad\n\nRTC_IRQP_SET                     rtc_irq_set_freq           \u8bbe\u7f6e\u4e2d\u65ad\u7684\u9891\u7387<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">1.2.4 RTC\u65f6\u95f4\u7ed3\u6784<\/h2>\n\n\n\n<p>rtc_time\u4ee3\u8868\u4e86RTC\u8bb0\u5f55\u7684\u65f6\u95f4\u4e0e\u65e5\u671f\uff0c\u4eceRTC\u8bbe\u5907\u8bfb\u56de\u7684\u65f6\u95f4\u548c\u65e5\u671f\u5c31\u4fdd\u5b58\u5728\u8fd9\u4e2a\u7ed3\u6784\u4f53\u4e2d\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>struct rtc_time {\n\n       int tm_sec;  \/\/\u79d2\n\n       int tm_min;  \/\/\u5206\u949f\n\n       int tm_hour; \/\/\u5c0f\u65f6\n\n       int tm_mday; \/\/\u5929\n\n       int tm_mon;  \/\/\u6708\n\n       int tm_year;  \/\/\u5e74\n\n       int tm_wday; \/\/\u4e00\u5468\u4e2d\u7684\u67d0\u4e00\u5929\n\n       int tm_yday; \/\/\u4e00\u5e74\u4e2d\u7684\u67d0\u4e00\u5929\n\n       int tm_isdst; \/\/\u590f\u4ee4\u65f6\u6709\u6548\n\n};<\/code><\/pre>\n\n\n\n<p>1.2.5 \u95f9\u949f\u7ed3\u6784<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>struct rtc_wkalrm {\n\n       unsigned char enabled;   \/* \u95f9\u949f\u4f7f\u80fd\u5f00\u5173    0 = alarm disabled, 1 = alarm enabled *\/\n\n       unsigned char pending; \n\n\/* \u95f9\u949f\u4fe1\u53f7\u5904\u7406\u72b6\u6001 0 = alarm not pending \u672a\u4ea7\u751f, 1 = alarm pending \u4ea7\u751f\u4e86\u95f9\u949f\u4fe1\u53f7*\/\n\n       struct rtc_time time;       \/* \u95f9\u949f\u8bbe\u7f6e\u7684\u65f6\u95f4 *\/\n\n};<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">1.3 \u7f16\u5199RTC\u9a71\u52a8\u4ee3\u7801<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">1.3.1 \u51c6\u5907\u5de5\u4f5c<\/h2>\n\n\n\n<p>\u8981\u6d4b\u8bd5\u81ea\u5df1\u7684\u7f16\u5199\u7684RTC\u9a71\u52a8\uff0c\u63d0\u524d\u9700\u8981\u5c06\u5185\u6838\u81ea\u5e26\u7684RTC\u9a71\u52a8\u5148\u53bb\u9664\u6389\uff0c\u518d\u91cd\u65b0\u7f16\u8bd1\u70e7\u5199\u5185\u6838\uff0c\u518d\u5b89\u88c5\u6d4b\u8bd5\u3002<\/p>\n\n\n\n<p>\u4ee5tiny4412\u5f00\u53d1\u677f\u4e3a\u4f8b\uff0c\u53bb\u9664\u6389\u81ea\u5e26\u7684rtc\u9a71\u52a8\u3002<\/p>\n\n\n\n<p><strong>1. \u8fdb\u5165\u5230\u5185\u6838\u914d\u7f6e\u83dc\u5355: make menuconfig<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  Device Drivers  --->\r\n       &#91;*] Real Time Clock  ---><\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"448\" src=\"http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-1-1024x448.png\" alt=\"\" class=\"wp-image-961\" srcset=\"http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-1-1024x448.png 1024w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-1-300x131.png 300w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-1-768x336.png 768w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-1-600x263.png 600w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-1.png 1364w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>2. \u91cd\u65b0\u7f16\u8bd1\u5185\u6838\uff0c\u518d\u91cd\u65b0\u70e7\u5199\u5185\u6838\u5230SD\u6216\u8005EMMC:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;root@wbyq boot]# .\/123.sh\r\n\r\n\u8bb0\u5f55\u4e869288+1 \u7684\u8bfb\u5165\r\n\r\n\u8bb0\u5f55\u4e869288+1 \u7684\u5199\u51fa\r\n\r\n4755752\u5b57\u8282(4.8 MB)\u5df2\u590d\u5236\uff0c33.2798 \u79d2\uff0c143 kB\/\u79d2<\/code><\/pre>\n\n\n\n<p>\u9ed8\u8ba4\u6ca1\u6709RTC\u9a71\u52a8\u7684\u60c5\u51b5\u4e0b\uff0c\u83b7\u53d6\u7cfb\u7edf\u65f6\u95f4\u662f\u4ece1970\u5e74\u5f00\u59cb\u7684:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"679\" height=\"125\" src=\"http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-2.png\" alt=\"\" class=\"wp-image-962\" srcset=\"http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-2.png 679w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-2-300x55.png 300w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-2-600x110.png 600w\" sizes=\"(max-width: 679px) 100vw, 679px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">1.3.2 RTC\u9a71\u52a8\u4ee3\u7801\u7f16\u5199\u2014\u6846\u67b6\u793a\u4f8b<\/h2>\n\n\n\n<p>\u4ee5\u4e0b\u4ee3\u7801\u53ea\u662f\u6f14\u793a\u4e86RTC\u9a71\u52a8\u7684\u6ce8\u518c\u6846\u67b6\u3002<\/p>\n\n\n\n<p><strong>1. RTC\u8bbe\u5907\u7aef\u4ee3\u7801:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include \"linux\/module.h\"\r\n#include \"linux\/init.h\"\r\n#include &lt;linux\/platform_device.h>\r\n\/*\r\n * device  \u8bbe\u5907\u7aef\r\n *\/\r\n \r\n\/\/\u91ca\u653e\u5e73\u53f0\u603b\u7ebf\r\nstatic void pdev_release(struct device *dev)\r\n{\r\n\tprintk(\"rtc_pdev:the rtc_pdev is close!!!\\n\");\r\n}\r\n \r\n\/*\u8bbe\u5907\u7aef\u7ed3\u6784\u4f53*\/\r\nstruct platform_device  rtc_pdev= \/*\u8bbe\u5907\u7ed3\u6784\u4f53\uff0c\u8bbe\u5907\u540d\u5b57\u5f88\u91cd\u8981!*\/\r\n{\r\n\t.name = \"tiny4412rtc\",  \/*\u8bbe\u5907\u540d*\/\r\n\t.id = -1,         \/*-1\u8868\u793a\u521b\u5efa\u6210\u529f\u540e\u8fd9\u8fb9\u8bbe\u5907\u7684\u540d\u5b57\u5c31\u53ebmyled\uff0c\u82e5\u8be5\u503c\u4e3a0\uff0c1\u5219\u8bbe\u5907\u540d\u662fmyled.0,myled.1...*\/\r\n\t.dev =            \/*\u9a71\u52a8\u5378\u8f7d\u65f6\u8c03\u7528*\/\r\n\t{\r\n\t\t.release = pdev_release,\/*\u91ca\u653e\u8d44\u6e90*\/\r\n\t},\r\n};\r\n \r\n \r\n\/*\u5e73\u53f0\u8bbe\u5907\u7aef\u5165\u53e3\u51fd\u6570*\/\r\nstatic int __init plat_dev_init(void)\r\n{\r\n\tplatform_device_register(&amp;rtc_pdev);\/*\u6ce8\u518c\u5e73\u53f0\u8bbe\u5907\u7aef*\/\r\n\treturn 0;\r\n}\r\n \r\n\/*\u5e73\u53f0\u8bbe\u5907\u7aef\u51fa\u53e3\u51fd\u6570*\/\r\nstatic void __exit plat_dev_exit(void)\r\n{\r\n\tplatform_device_unregister(&amp;rtc_pdev);\/*\u6ce8\u9500\u5e73\u53f0\u8bbe\u5907\u7aef*\/\r\n}\r\n \r\nmodule_init(plat_dev_init);\r\nmodule_exit(plat_dev_exit);\r\nMODULE_LICENSE(\"GPL\");<\/code><\/pre>\n\n\n\n<p><strong>2. RTC\u9a71\u52a8\u7aef\u4ee3\u7801<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> \r\n#include &lt;linux\/module.h>             \/*\u9a71\u52a8\u6a21\u5757\u76f8\u5173*\/\r\n#include &lt;linux\/init.h>\r\n#include &lt;linux\/fs.h>                 \/*\u6587\u4ef6\u64cd\u4f5c\u96c6\u5408*\/\r\n#include &lt;linux\/cdev.h>\r\n#include &lt;linux\/device.h>\r\n#include &lt;linux\/miscdevice.h>\r\n#include &lt;asm\/io.h>\r\n#include &lt;asm\/uaccess.h>\r\n#include &lt;linux\/interrupt.h>          \/*\u4e2d\u65ad\u76f8\u5173\u5934\u6587\u4ef6*\/\r\n#include &lt;linux\/irq.h>                \/*\u4e2d\u65ad\u76f8\u5173\u5934\u6587\u4ef6*\/\r\n#include &lt;linux\/gpio.h>               \/*\u786c\u4ef6\u76f8\u5173->\u5b9a\u4e49\u4e86\u5bc4\u5b58\u5668\u540d\u5b57\u4e0e\u5730\u5740*\/\r\n#include &lt;linux\/wait.h>              \r\n#include &lt;linux\/sched.h>\r\n#include &lt;linux\/timer.h>              \/*\u5185\u6838\u5b9a\u65f6\u5668*\/\r\n#include &lt;asm-generic\/poll.h>         \r\n#include &lt;linux\/poll.h>               \/* poll\u673a\u5236*\/\r\n#include &lt;linux\/platform_device.h>    \/* \u5e73\u53f0\u8bbe\u5907\u9a71\u52a8\u76f8\u5173\u5934\u6587\u4ef6*\/\r\n#include &lt;linux\/rtc.h>\r\n \r\nstatic int tiny4412_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)\r\n{\r\n\tprintk(\"\u83b7\u53d6\u65f6\u95f4\u6210\u529f\\n\");\r\n\treturn 0;\r\n}\r\n \r\nstatic int tiny4412_rtc_settime(struct device *dev, struct rtc_time *tm)\r\n{\r\n\tprintk(\"\u8bbe\u7f6e\u65f6\u95f4\u6210\u529f\\n\");\r\n\treturn 0;\t\r\n}\r\n \r\nstatic int tiny4412_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm)\r\n{\r\n\tprintk(\"getalarm\u8c03\u7528\u6210\u529f\\n\");\r\n\treturn 0;\t\r\n}\r\n \r\nstatic int tiny4412_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)\r\n{\r\n\tprintk(\"getalarm\u8c03\u7528\u6210\u529f\\n\");\r\n\treturn 0;\t\r\n}\r\n\t\r\nstatic int tiny4412_rtc_proc(struct device *dev, struct seq_file *seq)\r\n{\r\n\tprintk(\"proc\u8c03\u7528\u6210\u529f\\n\");\r\n\treturn 0;\t\r\n}\r\n \r\nstatic int tiny4412_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)\r\n{\r\n\tprintk(\"alarm_irq_enable\u8c03\u7528\u6210\u529f\\n\");\r\n\treturn 0;\t\r\n}\r\n \r\nstatic int tiny4412_rtc_ioctl(struct device *dev, unsigned int cmd,unsigned long arg)\r\n{\r\n\tprintk(\"ioctl\u8c03\u7528\u6210\u529f\\n\");\r\n\treturn 0;\r\n}\r\n \r\n \r\n\/*RTC\u6587\u4ef6\u64cd\u4f5c*\/\r\nstatic const struct rtc_class_ops tiny4412_rtcops = {\r\n\t.read_time\t= tiny4412_rtc_gettime,\r\n\t.set_time\t= tiny4412_rtc_settime,\r\n\t.read_alarm\t= tiny4412_rtc_getalarm,\r\n\t.set_alarm\t= tiny4412_rtc_setalarm,\r\n\t.proc\t\t= tiny4412_rtc_proc,\r\n\t.alarm_irq_enable = tiny4412_rtc_alarm_irq_enable,\r\n\t.ioctl\t\t= tiny4412_rtc_ioctl,\r\n};\r\n \r\nstruct rtc_device *rtc=NULL;\r\n \r\n\/*\u5f53\u8bbe\u5907\u5339\u914d\u6210\u529f\u6267\u884c\u7684\u51fd\u6570-\u8d44\u6e90\u63a2\u67e5\u51fd\u6570*\/\r\nstatic int drv_probe(struct platform_device *pdev)\r\n{\t\r\n\trtc = rtc_device_register(\"tiny4412_rtc\",&amp;pdev->dev, &amp;tiny4412_rtcops,THIS_MODULE);\r\n\tif(rtc==NULL)\r\n\tprintk(\"RTC\u9a71\u52a8\u6ce8\u518c\u5931\u8d25\\n\");\r\n\telse\r\n  \t{\r\n  \t\tprintk(\"RTC\u9a71\u52a8\u6ce8\u518c\u6210\u529f\\n\");\r\n  \t}         \r\n\treturn 0;\r\n}\r\n \r\nstatic int drv_remove(struct platform_device *dev)\/*\u5f53\u8bbe\u5907\u5378\u8f7d\u540e\u8c03\u7528\u8fd9\u6761\u51fd\u6570*\/\r\n{\r\n\trtc_device_unregister(rtc);\r\n\tprintk(\"RTC\u9a71\u52a8\u5378\u8f7d\u6210\u529f\\n\");\r\n\treturn 0;\r\n}\r\n \r\n \r\n\/*\u5e73\u53f0\u8bbe\u5907\u9a71\u52a8\u7aef\u7ed3\u6784\u4f53-\u5305\u542b\u548cprobe\u5339\u914d\u7684\u8bbe\u5907\u540d\u5b57*\/\r\nstruct platform_driver  drv= \r\n{\r\n\t.probe = drv_probe,    \/*\u9700\u8981\u521b\u5efa\u4e00\u4e2aprobe\u51fd\u6570\uff0c\u8fd9\u4e2a\u51fd\u6570\u662f\u5bf9\u8bbe\u5907\u8fdb\u884c\u64cd\u4f5c*\/\r\n\t.remove = drv_remove,  \/*\u521b\u5efa\u4e00\u4e2aremove\u51fd\u6570\uff0c\u7528\u4e8e\u8bbe\u5907\u9000\u51fa*\/\r\n\t.driver = \r\n\t{\r\n\t\t.name = \"tiny4412rtc\",    \/*\u8bbe\u5907\u540d\u79f0,\u7528\u6765\u4e0e\u8bbe\u5907\u7aef\u5339\u914d(\u975e\u5e38\u91cd\u8981)*\/\r\n\t},\r\n};\r\n \r\n\/*\u5e73\u53f0\u9a71\u52a8\u7aef\u7684\u5165\u53e3\u51fd\u6570*\/\r\nstatic int __init plat_drv_init(void)\r\n{\r\n\tplatform_driver_register(&amp;drv);\/*\u6ce8\u518c\u5e73\u53f0\u9a71\u52a8*\/\t\r\n\treturn 0;\r\n}\r\n \r\n\/*\u5e73\u53f0\u9a71\u52a8\u7aef\u7684\u51fa\u53e3\u51fd\u6570*\/\r\nstatic void __exit plat_drv_exit(void)\r\n{\r\n\tplatform_driver_unregister(&amp;drv);\/*\u91ca\u653e\u5e73\u53f0\u9a71\u52a8*\/\r\n}\r\n \r\nmodule_init(plat_drv_init);  \/*\u9a71\u52a8\u6a21\u5757\u7684\u5165\u53e3*\/\r\nmodule_exit(plat_drv_exit);  \/*\u9a71\u52a8\u6a21\u5757\u7684\u51fa\u53e3*\/\r\nMODULE_LICENSE(\"GPL\"); \/*\u9a71\u52a8\u7684\u8bb8\u53ef\u8bc1-\u58f0\u660e*\/<\/code><\/pre>\n\n\n\n<p><strong>3. \u5b89\u88c5RTC\u9a71\u52a8<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"251\" src=\"http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-3-1024x251.png\" alt=\"\" class=\"wp-image-963\" srcset=\"http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-3-1024x251.png 1024w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-3-300x74.png 300w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-3-768x188.png 768w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-3-600x147.png 600w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-3.png 1358w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>4. \u67e5\u770b\u751f\u6210\u7684RTC\u7684\u8bbe\u5907\u8282\u70b9<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"70\" src=\"http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-4-1024x70.png\" alt=\"\" class=\"wp-image-964\" srcset=\"http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-4-1024x70.png 1024w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-4-300x20.png 300w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-4-768x52.png 768w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-4-600x41.png 600w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-4.png 1099w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong><strong>\u00a05. \u67e5\u770brtc\u4fe1\u606f<\/strong><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"454\" src=\"http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-5-1024x454.png\" alt=\"\" class=\"wp-image-965\" srcset=\"http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-5-1024x454.png 1024w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-5-300x133.png 300w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-5-768x341.png 768w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-5-600x266.png 600w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-5.png 1148w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>\u67e5\u770b\/proc\/driver\/rtc\u6587\u4ef6\u65f6\uff0c\u5e95\u5c42\u9a71\u52a8\u51fd\u6570\u63a5\u53e3\u4e5f\u76f8\u7ee7\u88ab\u8c03\u7528\uff0c\u53ea\u4e0d\u8fc7\u521a\u624d\u5199\u7684RTC\u9a71\u52a8\u6ca1\u6709\u5b8c\u5584\uff0c\u6240\u4ee5\u83b7\u53d6\u7684\u4fe1\u606f\u4e0d\u6b63\u786e\uff0c\u662f\u9ed8\u8ba4\u503c\u3002<\/p>\n\n\n\n<p><strong>6. \u8bbe\u7f6eRTC\u65f6\u95f4\u76f8\u5173\u7684\u547d\u4ee4\u6d4b\u8bd5<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"762\" height=\"430\" src=\"http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-6.png\" alt=\"\" class=\"wp-image-966\" srcset=\"http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-6.png 762w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-6-300x169.png 300w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-6-600x339.png 600w\" sizes=\"(max-width: 762px) 100vw, 762px\" \/><\/figure>\n\n\n\n<p>\u901a\u8fc7\u547d\u4ee4\u6d4b\u8bd5\uff0c\u8bbe\u7f6e\u65f6\u95f4\u548c\u83b7\u53d6\u65f6\u95f4\u90fd\u8c03\u7528\u4e86\u5e95\u5c42\u7684RTC\u51fd\u6570\u63a5\u53e3\uff0c\u5269\u4e0b\u7684\u5de5\u4f5c\u5c31\u662f\u5b8c\u5584\u9a71\u52a8\u4ee3\u7801\u4e86\u3002<\/p>\n\n\n\n<p>1.3.3 \u5b8c\u5584RTC\u9a71\u52a8<br>\u4e0a\u4e00\u6b65\u5b8c\u6210\u4e86RTC\u9a71\u52a8\u4ee3\u7801\u6846\u67b6\u7f16\u5199\uff0c\u8fd9\u4e00\u6b65\u5c31\u5148\u4e0d\u6dfb\u52a0RTC\u786c\u4ef6\u4ee3\u7801\uff0c\u4f7f\u7528\u8f6f\u4ef6\u65b9\u5f0f\u6a21\u62df\u65f6\u95f4\u4f20\u9012\u7ed9\u5e94\u7528\u5c42\u3002<\/p>\n\n\n\n<p>\u6ce8\u610f: \u5185\u6838\u91ccRTC\u65f6\u95f4\u6362\u7b97\u7684\u65f6\u95f4\u662f\u4ece: 1900\u5e74\u5f00\u59cb\u8ba1\u7b97\u7684\uff0c\u6708\u4efd\u662f\u4ece0\u5f00\u59cb\u7684\u3002<\/p>\n\n\n\n<p>\u5728\u7ed9rtc\u7ed3\u6784\u8d4b\u503c\u65f6\uff0c\u5728\u6b63\u5e38\u7684\u5e74\u4efd\u4e0a\u9700\u8981\u51cf\u53bb1900\uff0c\u6708\u4efd\u518d\u51cf\u53bb1<\/p>\n\n\n\n<p>\u8d4b\u503c\u793a\u4f8b:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/\u6b64\u51fd\u6570\u53ef\u4ee5\u901a\u8fc7\u5e94\u7528\u5c42\u7684ioctl\u7684RTC_RD_TIME\u547d\u4ee4\u8fdb\u884c\u8c03\u7528\r\nstatic int tiny4412_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)\r\n{\r\n\trtc_tm->tm_year=2018-1900;   \/\/\u5e74 \r\n\trtc_tm->tm_mon=8-1;         \/\/\u6708 \r\n\trtc_tm->tm_mday=18;         \/\/\u65e5 \r\n\trtc_tm->tm_hour=18;\t\t   \/\/\u65f6 \r\n\trtc_tm->tm_min=18;\t\t\/\/\u5206 \r\n\trtc_tm->tm_sec=18;\/\/\u79d2\r\n\tprintk(\"\u4eceRTC\u5e95\u5c42\u83b7\u53d6\u65f6\u95f4\u6210\u529f!\\n\");\r\n\treturn 0;\r\n}<\/code><\/pre>\n\n\n\n<p><strong>\u5e94\u7528\u5c42\u83b7\u53d6\u7684\u65f6\u95f4\u5982\u4e0b:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"759\" height=\"116\" src=\"http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-7.png\" alt=\"\" class=\"wp-image-967\" srcset=\"http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-7.png 759w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-7-300x46.png 300w, http:\/\/www.recologypower.com:9080\/wp-content\/uploads\/2022\/09\/\u5fae\u4fe1\u56fe\u7247_20220901102507-7-600x92.png 600w\" sizes=\"(max-width: 759px) 100vw, 759px\" \/><\/figure>\n\n\n\n<p><strong>\u5b8c\u5584\u8fc7\u540e\u7684RTC\u8bbe\u5907\u9a71\u52a8\u7aef\u4ee3\u7801<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;linux\/module.h>             \/*\u9a71\u52a8\u6a21\u5757\u76f8\u5173*\/\r\n#include &lt;linux\/init.h>\r\n#include &lt;linux\/fs.h>                 \/*\u6587\u4ef6\u64cd\u4f5c\u96c6\u5408*\/\r\n#include &lt;linux\/cdev.h>\r\n#include &lt;linux\/device.h>\r\n#include &lt;linux\/miscdevice.h>\r\n#include &lt;asm\/io.h>\r\n#include &lt;asm\/uaccess.h>\r\n#include &lt;linux\/interrupt.h>          \/*\u4e2d\u65ad\u76f8\u5173\u5934\u6587\u4ef6*\/\r\n#include &lt;linux\/irq.h>                \/*\u4e2d\u65ad\u76f8\u5173\u5934\u6587\u4ef6*\/\r\n#include &lt;linux\/gpio.h>               \/*\u786c\u4ef6\u76f8\u5173->\u5b9a\u4e49\u4e86\u5bc4\u5b58\u5668\u540d\u5b57\u4e0e\u5730\u5740*\/\r\n#include &lt;linux\/wait.h>              \r\n#include &lt;linux\/sched.h>\r\n#include &lt;linux\/timer.h>              \/*\u5185\u6838\u5b9a\u65f6\u5668*\/\r\n#include &lt;asm-generic\/poll.h>         \r\n#include &lt;linux\/poll.h>               \/* poll\u673a\u5236*\/\r\n#include &lt;linux\/platform_device.h>    \/* \u5e73\u53f0\u8bbe\u5907\u9a71\u52a8\u76f8\u5173\u5934\u6587\u4ef6*\/\r\n#include &lt;linux\/rtc.h>\r\n \r\n\/\/\u6b64\u51fd\u6570\u53ef\u4ee5\u901a\u8fc7\u5e94\u7528\u5c42\u7684ioctl\u7684RTC_RD_TIME\u547d\u4ee4\u8fdb\u884c\u8c03\u7528\r\nstatic int tiny4412_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)\r\n{\r\n\trtc_tm->tm_year=2018-1900;   \/\/\u5e74 \r\n\trtc_tm->tm_mon=8-1;     \/\/\u6708 \r\n\trtc_tm->tm_mday=18;   \/\/\u65e5 \r\n\trtc_tm->tm_hour=18;\t\t\/\/\u65f6 \r\n\trtc_tm->tm_min=18;\t\t\/\/\u5206 \r\n\trtc_tm->tm_sec=18;\/\/\u79d2\r\n\tprintk(\"\u4eceRTC\u5e95\u5c42\u83b7\u53d6\u65f6\u95f4\u6210\u529f!\\n\");\r\n\treturn 0;\r\n}\r\n \r\n\/\/\u6b64\u51fd\u6570\u53ef\u4ee5\u901a\u8fc7\u5e94\u7528\u5c42\u7684ioctl\u7684RTC_SET_TIME\u547d\u4ee4\u8fdb\u884c\u8c03\u7528\r\nstatic int tiny4412_rtc_settime(struct device *dev, struct rtc_time *tm)\r\n{\r\n    printk(\"RTC\u6536\u5230\u7684\u65f6\u95f4\u4e3a:%d-%d-%d %d-%d-%d\\n\",1900 + tm->tm_year, tm->tm_mon, tm->tm_mday,\r\n\t\t tm->tm_hour, tm->tm_min, tm->tm_sec);\r\n\treturn 0;\t\r\n}\r\n \r\n\/\/\u83b7\u53d6\u95f9\u949f\u65f6\u95f4\r\nstatic int tiny4412_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm)\r\n{\r\n\talrm->enabled=0;  \/\/\u9ed8\u8ba4\u95f9\u949f\u5904\u4e8e\u5173\u95ed\u72b6\u6001\r\n    alrm->time.tm_year=2018-1900;  \/\/\u5e74 \r\n\talrm->time.tm_mon=8-1;    \/\/\u6708 \r\n\talrm->time.tm_mday=18;  \/\/\u65e5 \r\n\talrm->time.tm_hour=18;\t\/\/\u65f6 \r\n\talrm->time.tm_min=18;\t\/\/\u5206 \r\n\talrm->time.tm_sec=18;\t\/\/\u79d2\r\n\tprintk(\"\u4eceRTC\u5e95\u5c42\u83b7\u53d6\u95f9\u949f\u65f6\u95f4\u6210\u529f!\\n\");\r\n\treturn 0;\t\r\n}\r\n \r\n\/\/\u8bbe\u7f6e\u95f9\u949f\u65f6\u95f4\r\nstatic int tiny4412_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)\r\n{\r\n\tprintk(\"RTC\u95f9\u949f\u8bbe\u7f6e\u6210\u529f\\n\");\r\n\treturn 0;\t\r\n}\r\n \r\n\/\/proc\u63a5\u53e3\u8c03\u7528\r\nstatic int tiny4412_rtc_proc(struct device *dev, struct seq_file *seq)\r\n{\r\n\tprintk(\"proc\u8c03\u7528\u6210\u529f\\n\");\r\n\treturn 0;\t\r\n}\r\n \r\n\/\/\u95f9\u949f\u4e2d\u65ad\u4f7f\u80fd\r\nstatic int tiny4412_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)\r\n{\r\n\tprintk(\"alarm_irq_enable\u8c03\u7528\u6210\u529f\\n\");\r\n\treturn 0;\t\r\n}\r\n \r\n\/\/\u53ef\u4ee5\u5b9e\u73b0\u7528\u6237\u81ea\u5b9a\u4e49\u7684\u547d\u4ee4\r\nstatic int tiny4412_rtc_ioctl(struct device *dev, unsigned int cmd,unsigned long arg)\r\n{\r\n\tprintk(\"ioctl\u8c03\u7528\u6210\u529f\\n\");\r\n\treturn 0;\r\n}\r\n \r\n\/*RTC\u6587\u4ef6\u64cd\u4f5c*\/\r\nstatic const struct rtc_class_ops tiny4412_rtcops = {\r\n\t.read_time\t= tiny4412_rtc_gettime,\r\n\t.set_time\t= tiny4412_rtc_settime,\r\n\t.read_alarm\t= tiny4412_rtc_getalarm,\r\n\t.set_alarm\t= tiny4412_rtc_setalarm,\r\n\t.proc\t\t= tiny4412_rtc_proc,\r\n\t.alarm_irq_enable = tiny4412_rtc_alarm_irq_enable,\r\n\t.ioctl\t\t= tiny4412_rtc_ioctl,\r\n};\r\n \r\nstruct rtc_device *rtc=NULL;\r\n \r\n\/*\u5f53\u8bbe\u5907\u5339\u914d\u6210\u529f\u6267\u884c\u7684\u51fd\u6570-\u8d44\u6e90\u63a2\u67e5\u51fd\u6570*\/\r\nstatic int drv_probe(struct platform_device *pdev)\r\n{\t\r\n\trtc = rtc_device_register(\"tiny4412_rtc\",&amp;pdev->dev, &amp;tiny4412_rtcops,THIS_MODULE);\r\n\tif(rtc==NULL)\r\n\tprintk(\"RTC\u9a71\u52a8\u6ce8\u518c\u5931\u8d25\\n\");\r\n\telse\r\n  \t{\r\n  \t\tprintk(\"RTC\u9a71\u52a8\u6ce8\u518c\u6210\u529f\\n\");\r\n  \t}         \r\n\treturn 0;\r\n}\r\n \r\nstatic int drv_remove(struct platform_device *dev)\/*\u5f53\u8bbe\u5907\u5378\u8f7d\u540e\u8c03\u7528\u8fd9\u6761\u51fd\u6570*\/\r\n{\r\n\trtc_device_unregister(rtc);\r\n\tprintk(\"RTC\u9a71\u52a8\u5378\u8f7d\u6210\u529f\\n\");\r\n\treturn 0;\r\n}\r\n \r\n\/*\u5e73\u53f0\u8bbe\u5907\u9a71\u52a8\u7aef\u7ed3\u6784\u4f53-\u5305\u542b\u548cprobe\u5339\u914d\u7684\u8bbe\u5907\u540d\u5b57*\/\r\nstruct platform_driver  drv= \r\n{\r\n\t.probe = drv_probe,    \/*\u9700\u8981\u521b\u5efa\u4e00\u4e2aprobe\u51fd\u6570\uff0c\u8fd9\u4e2a\u51fd\u6570\u662f\u5bf9\u8bbe\u5907\u8fdb\u884c\u64cd\u4f5c*\/\r\n\t.remove = drv_remove,  \/*\u521b\u5efa\u4e00\u4e2aremove\u51fd\u6570\uff0c\u7528\u4e8e\u8bbe\u5907\u9000\u51fa*\/\r\n\t.driver = \r\n\t{\r\n\t\t.name = \"tiny4412rtc\",    \/*\u8bbe\u5907\u540d\u79f0,\u7528\u6765\u4e0e\u8bbe\u5907\u7aef\u5339\u914d(\u975e\u5e38\u91cd\u8981)*\/\r\n\t},\r\n};\r\n \r\n\/*\u5e73\u53f0\u9a71\u52a8\u7aef\u7684\u5165\u53e3\u51fd\u6570*\/\r\nstatic int __init plat_drv_init(void)\r\n{\r\n\tplatform_driver_register(&amp;drv);\/*\u6ce8\u518c\u5e73\u53f0\u9a71\u52a8*\/\t\r\n\treturn 0;\r\n}\r\n \r\n\/*\u5e73\u53f0\u9a71\u52a8\u7aef\u7684\u51fa\u53e3\u51fd\u6570*\/\r\nstatic void __exit plat_drv_exit(void)\r\n{\r\n\tplatform_driver_unregister(&amp;drv);\/*\u91ca\u653e\u5e73\u53f0\u9a71\u52a8*\/\r\n}\r\n \r\nmodule_init(plat_drv_init);  \/*\u9a71\u52a8\u6a21\u5757\u7684\u5165\u53e3*\/\r\nmodule_exit(plat_drv_exit);  \/*\u9a71\u52a8\u6a21\u5757\u7684\u51fa\u53e3*\/\r\nMODULE_LICENSE(\"GPL\"); \/*\u9a71\u52a8\u7684\u8bb8\u53ef\u8bc1-\u58f0\u660e*\/<\/code><\/pre>\n\n\n\n<p><strong><strong>\u5b89\u88c5\u6d4b\u8bd5\u7ed3\u679c:<\/strong><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;root@XiaoLong \/code]# date\r\nThu Jan  1 00:00:13 UTC 1970\r\n&#91;root@XiaoLong \/code]# insmod plat_rtc_device.ko \r\n&#91;root@XiaoLong \/code]# insmod plat_rtc_drver.ko \r\n&#91;   24.350000] \u4eceRTC\u5e95\u5c42\u83b7\u53d6\u65f6\u95f4\u6210\u529f!\r\n&#91;   24.350000] \u4eceRTC\u5e95\u5c42\u83b7\u53d6\u95f9\u949f\u65f6\u95f4\u6210\u529f!\r\n&#91;   24.350000] \u4eceRTC\u5e95\u5c42\u83b7\u53d6\u65f6\u95f4\u6210\u529f!\r\n&#91;   24.350000] tiny4412rtc tiny4412rtc: rtc core: registered tiny4412_rtc as rtc0\r\n&#91;   24.350000] RTC\u9a71\u52a8\u6ce8\u518c\u6210\u529f\r\n&#91;root@XiaoLong \/code]# cat \/proc\/driver\/rtc \r\n&#91;   37.085000] \u4eceRTC\u5e95\u5c42\u83b7\u53d6\u65f6\u95f4\u6210\u529f!\r\n&#91;   37.085000] proc\u8c03\u7528\u6210\u529f\r\nrtc_time        : 18:18:18\r\nrtc_date        : 2018-08-18\r\nalrm_time       : 18:18:18\r\nalrm_date       : 2018-08-18\r\nalarm_IRQ       : no\r\nalrm_pending    : no\r\nupdate IRQ enabled      : no\r\nperiodic IRQ enabled    : no\r\nperiodic IRQ frequency  : 1\r\nmax user IRQ frequency  : 64\r\n24hr            : yes\r\n&#91;root@XiaoLong \/code]# \r\n&#91;root@XiaoLong \/code]# hwclock -s\r\n&#91;   58.600000] \u4eceRTC\u5e95\u5c42\u83b7\u53d6\u65f6\u95f4\u6210\u529f!\r\n&#91;root@XiaoLong \/code]# hwclock -r\r\n&#91;   61.020000] \u4eceRTC\u5e95\u5c42\u83b7\u53d6\u65f6\u95f4\u6210\u529f!\r\nSat Aug 18 18:18:18 2018  0.000000 seconds\r\n&#91;root@XiaoLong \/code]# hwclock -w\r\n&#91;   62.920000] RTC\u6536\u5230\u7684\u65f6\u95f4\u4e3a:2018-7-18 18-18-22\r\n&#91;   62.920000] \u4eceRTC\u5e95\u5c42\u83b7\u53d6\u65f6\u95f4\u6210\u529f!\r\n&#91;   62.920000] alarm_irq_enable\u8c03\u7528\u6210\u529f\r\n&#91;root@XiaoLong \/code]# date\r\nSat Aug 18 18:18:24 UTC 2018<\/code><\/pre>\n\n\n\n<p>1.3.4 RTC\u5e94\u7528\u5c42\u4ee3\u7801<\/p>\n\n\n\n<p>\u5e94\u7528\u5c42\u60f3\u8981\u4e0eRTC\u9a71\u52a8\u4ea4\u4e92\uff0c\u53ef\u4ee5\u4f7f\u7528ioctl\u51fd\u6570\u7279\u5b9a\u7684\u4e00\u4e9b\u547d\u4ee4\u8fdb\u884c\u3002<\/p>\n\n\n\n<p>RTC\u5b50\u7cfb\u7edf\u5e38\u7528\u7684ioctl\u547d\u4ee4\u5982\u4e0b:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/\u652f\u6301\u7684\u5168\u90e8\u547d\u4ee4 \u5728interface.c\u6587\u4ef6\u4e2d\u6709\u4f7f\u7528\u8303\u4f8b\u3002 \u8fd9\u4e9b\u547d\u4ee4\u5728\u7528\u6237\u81ea\u5df1\u5199\u5e94\u7528\u5c42\u4ee3\u7801\u65f6\u53ef\u4ee5\u7528\u5230\r\nRTC_ALM_READ                     rtc_read_alarm        \u8bfb\u53d6\u95f9\u949f\u65f6\u95f4\r\nRTC_ALM_SET                      rtc_set_alarm          \u8bbe\u7f6e\u95f9\u949f\u65f6\u95f4\r\nRTC_RD_TIME                      rtc_read_time          \u8bfb\u53d6\u65f6\u95f4\u4e0e\u65e5\u671f\r\nRTC_SET_TIME                     rtc_set_time            \u8bbe\u7f6e\u65f6\u95f4\u4e0e\u65e5\u671f\r\nRTC_PIE_ON RTC_PIE_OFF           rtc_irq_set_state         \u5f00\u5173RTC\u5168\u5c40\u4e2d\u65ad\u7684\u51fd\u6570\r\nRTC_AIE_ON RTC_AIE_OFF           rtc_alarm_irq_enable     \u4f7f\u80fd\u7981\u6b62RTC\u95f9\u949f\u4e2d\u65ad\r\nRTC_UIE_OFF RTC_UIE_ON           rtc_update_irq_enable    \u4f7f\u80fd\u7981\u6b62RTC\u66f4\u65b0\u4e2d\u65ad\r\nRTC_IRQP_SET                       rtc_irq_set_freq           \u8bbe\u7f6e\u4e2d\u65ad\u7684\u9891\u7387<\/code><\/pre>\n\n\n\n<p><strong>\u793a\u4f8b\u4ee3\u7801:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h>\r\n#include &lt;sys\/types.h>\r\n#include &lt;sys\/stat.h>\r\n#include &lt;fcntl.h>\r\n#include &lt;sys\/ioctl.h>\r\n#include &lt;linux\/rtc.h>\r\nstruct rtc_time time; \/\/\u4fdd\u5b58\u65f6\u95f4\u503c\r\n \r\nint main(int argc,char **argv)\r\n{\r\n\tif(argc!=2)\r\n\t{\r\n\t\tprintf(\"\u4f20\u53c2\u683c\u5f0f:\/dev\/rtc\\r\\n\");\r\n\t\treturn;\r\n\t}\r\n\tint fd=open(argv&#91;1],O_RDWR); \/\/ 2==O_RDWR\r\n\tif(fd&lt;0)\r\n\t{\r\n\t\tprintf(\"\u9a71\u52a8\u8bbe\u5907\u6587\u4ef6\u6253\u5f00\u5931\u8d25!\\r\\n\");\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\ttime.tm_year=2017;\r\n\ttime.tm_mon=10;\r\n\ttime.tm_mday=13;\r\n\ttime.tm_hour=21;\r\n\ttime.tm_min=10;\r\n\ttime.tm_sec=10;\r\n\t\r\n\t\r\n\t\/\/\u6ce8\u610f\uff1a\u5e74\u6708\u65e5\u5fc5\u987b\u586b\u5199\u6b63\u5e38\uff0c\u5426\u5219\u4f1a\u5bfc\u81f4\u5e95\u5c42\u51fd\u6570\u65e0\u6cd5\u8c03\u7528\u6210\u529f\r\n    ioctl(fd,RTC_SET_TIME,&amp;time);   \/\/\u5e95\u5c42\u81ea\u5df1\u5b9e\u73b0\u4e86ioctl\u51fd\u6570\uff0c\u8bbe\u7f6eRTC\u65f6\u95f4\r\n\twhile(1)\r\n\t{\r\n\t\tioctl(fd,RTC_RD_TIME,&amp;time);\r\n\t\tprintf(\"%d-%d-%d %d:%d:%d\\r\\n\",time.tm_year,time.tm_mon,time.tm_mday,time.tm_hour,time.tm_min,time.tm_sec);\r\n\t\tsleep(1);\r\n\t}\r\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">1.3.5 \u6807\u51c6\u65f6\u95f4\u5230\u79d2\u5355\u4f4d\u65f6\u95f4\u8f6c\u6362\u51fd\u6570<\/h2>\n\n\n\n<p>\u786c\u4ef6\u4e0a\u6709\u4e9bRTC\u5b9e\u65f6\u65f6\u949f\u8bbe\u7f6e\u53ea\u8ba1\u7b97\u79d2\u6570\uff0c\u4e0d\u63d0\u4f9b\u5e74\u6708\u65e5\u65f6\u5206\u79d2\u683c\u5f0f\u7684\u65f6\u95f4\u8bbe\u7f6e\uff0c\u8fd9\u65f6\u5019\u5c31\u9700\u8981\u81ea\u5df1\u5bf9\u6807\u51c6\u65f6\u95f4\u8fdb\u884c\u8f6c\u6362\u3002<\/p>\n\n\n\n<p><strong>\u5c06\u6807\u51c6\u65f6\u95f4\u8f6c\u4e3a\u79d2\u5355\u4f4d\u65f6\u95f4:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*\r\n * \u81ea01-01-1970\u5c31\u662f\u5c06\u516c\u5386\u65e5\u671f\u8f6c\u6362\u4e3a\u79d2\u3002\r\n *\/\r\nint rtc_tm_to_time(struct rtc_time *tm, unsigned long *time)\r\n{\r\n\t*time = mktime(tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,\r\n\t\t\ttm->tm_hour, tm->tm_min, tm->tm_sec);\r\n\treturn 0;\r\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">1.3.6 DS1302\u65f6\u949f\u82af\u7247\u9a71\u52a8\u7f16\u5199\u793a\u4f8b<\/h2>\n\n\n\n<p>\u4e0a\u9762\u4ee3\u7801\u90fd\u662f\u6a21\u62df\u65f6\u949f\uff0c\u5b66\u4e60RTC\u6846\u67b6\u7684\u7528\u6cd5\uff0c\u4e0b\u9762\u7684\u7684\u4ee3\u7801\u5c31\u52a0\u5165\u4e86\u5b9e\u9645\u7684RTC\u786c\u4ef6\uff0c\u5b9e\u73b0\u5b8c\u6574\u7684RTC\u8ba1\u65f6\u3002<\/p>\n\n\n\n<p><strong>DS1302\u9a71\u52a8\u7aef\u4ee3\u7801:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;linux\/module.h>             \/*\u9a71\u52a8\u6a21\u5757\u76f8\u5173*\/\r\n#include &lt;linux\/init.h>\r\n#include &lt;linux\/fs.h>                 \/*\u6587\u4ef6\u64cd\u4f5c\u96c6\u5408*\/\r\n#include &lt;linux\/cdev.h>\r\n#include &lt;linux\/device.h>\r\n#include &lt;linux\/miscdevice.h>\r\n#include &lt;asm\/io.h>\r\n#include &lt;asm\/uaccess.h>\r\n#include &lt;linux\/interrupt.h>          \/*\u4e2d\u65ad\u76f8\u5173\u5934\u6587\u4ef6*\/\r\n#include &lt;linux\/irq.h>                \/*\u4e2d\u65ad\u76f8\u5173\u5934\u6587\u4ef6*\/\r\n#include &lt;linux\/gpio.h>               \/*\u786c\u4ef6\u76f8\u5173->\u5b9a\u4e49\u4e86\u5bc4\u5b58\u5668\u540d\u5b57\u4e0e\u5730\u5740*\/\r\n#include &lt;linux\/wait.h>              \r\n#include &lt;linux\/sched.h>\r\n#include &lt;linux\/timer.h>              \/*\u5185\u6838\u5b9a\u65f6\u5668*\/\r\n#include &lt;asm-generic\/poll.h>         \r\n#include &lt;linux\/poll.h>               \/* poll\u673a\u5236*\/\r\n#include &lt;linux\/platform_device.h>    \/* \u5e73\u53f0\u8bbe\u5907\u9a71\u52a8\u76f8\u5173\u5934\u6587\u4ef6*\/\r\n#include &lt;linux\/rtc.h>\r\n#include &lt;linux\/gpio.h>\r\n#include &lt;mach\/gpio.h>\r\n#include &lt;plat\/gpio-cfg.h>\r\n#include &lt;linux\/delay.h>\r\n \r\n\/*--------------------------------DS1302\u76f8\u5173\u64cd\u4f5c\u4ee3\u7801---------------------------------------------*\/\r\nstatic unsigned char RTC_bin2bcd(unsigned val)\r\n{\r\n\treturn ((val\/10)&lt;&lt;4)+val%10;\r\n}\r\n \r\nstatic unsigned RTC_bcd2bin(unsigned char val)\r\n{\r\n\treturn (val&amp;0x0f)+(val>>4)*10;\r\n}\r\n \r\n\/*\r\n\u51fd\u6570\u529f\u80fd\uff1aDS1302\u521d\u59cb\u5316\r\nTiny4412\u786c\u4ef6\u8fde\u63a5\uff1a\r\n\tCLK :GPB_4\r\n\tDAT :GPB_5\r\n\tRST :GPB_6\r\n*\/\r\nvoid DS1302IO_Init(void)\r\n{\r\n\t\/*1. \u6ce8\u518cGPIO*\/\r\n\tgpio_request(EXYNOS4_GPB(4), \"DS1302_CLK\");\r\n\tgpio_request(EXYNOS4_GPB(5), \"DS1302_DAT\");\r\n\tgpio_request(EXYNOS4_GPB(6), \"DS1302_RST\");\r\n\t\r\n\t\/*2. \u914d\u7f6eGPIO\u53e3\u6a21\u5f0f*\/\r\n\ts3c_gpio_cfgpin(EXYNOS4_GPB(4), S3C_GPIO_OUTPUT);  \/\/\u65f6\u949f\r\n\ts3c_gpio_cfgpin(EXYNOS4_GPB(5), S3C_GPIO_OUTPUT);  \/\/\u6570\u636e\r\n\/\/\ts3c_gpio_cfgpin(EXYNOS4_GPB(2), S3C_GPIO_INPUT);   \/\/\u8f93\u5165\u6a21\u5f0f\r\n\ts3c_gpio_cfgpin(EXYNOS4_GPB(6), S3C_GPIO_OUTPUT);  \/\/\u590d\u4f4d\r\n\t\r\n\t\/*3. \u4e0a\u62c9GPIO\u53e3*\/\r\n\tgpio_set_value(EXYNOS4_GPB(4), 1); \/\/CLK\r\n\tgpio_set_value(EXYNOS4_GPB(5), 1); \/\/DAT\r\n \tgpio_set_value(EXYNOS4_GPB(6), 1); \/\/RST\r\n\t\r\n\tgpio_set_value(EXYNOS4_GPB(6), 0);\t\t\t\/\/RST\u811a\u7f6e\u4f4e\r\n\tgpio_set_value(EXYNOS4_GPB(4), 0);\t\t\t\/\/SCK\u811a\u7f6e\u4f4e\r\n}\r\n \r\n \r\n\/\/#define\tRTC_CMD_READ\t0x81\t\t\/* Read command *\/\r\n\/\/#define\tRTC_CMD_WRITE\t0x80\t\t\/* Write command *\/\r\n\/\/#define RTC_ADDR_RAM0\t0x20\t\t\t\/* Address of RAM0 *\/\r\n\/\/#define RTC_ADDR_TCR\t0x08\t\t\t\/* Address of trickle charge register *\/\r\n\/\/#define\tRTC_ADDR_YEAR\t0x06\t\t\/* Address of year register *\/\r\n\/\/#define\tRTC_ADDR_DAY\t0x05\t\t\/* Address of day of week register *\/\r\n\/\/#define\tRTC_ADDR_MON\t0x04\t\t\/* Address of month register *\/\r\n\/\/#define\tRTC_ADDR_DATE\t0x03\t\t\/* Address of day of month register *\/\r\n\/\/#define\tRTC_ADDR_HOUR\t0x02\t\t\/* Address of hour register *\/\r\n\/\/#define\tRTC_ADDR_MIN\t0x01\t\t\/* Address of minute register *\/\r\n\/\/#define\tRTC_ADDR_SEC\t0x00\t\t\/* Address of second register *\/\r\n \r\n \r\n\/\/DS1302\u5730\u5740\u5b9a\u4e49\r\n#define ds1302_sec_add\t\t\t0x80\t\t\/\/\u79d2\u6570\u636e\u5730\u5740\r\n#define ds1302_min_add\t\t\t0x82\t\t\/\/\u5206\u6570\u636e\u5730\u5740\r\n#define ds1302_hr_add\t\t\t0x84\t\t\/\/\u65f6\u6570\u636e\u5730\u5740\r\n#define ds1302_date_add\t\t\t0x86\t\t\/\/\u65e5\u6570\u636e\u5730\u5740\r\n#define ds1302_month_add\t\t0x88\t\t\/\/\u6708\u6570\u636e\u5730\u5740\r\n#define ds1302_day_add\t\t\t0x8a\t\t\/\/\u661f\u671f\u6570\u636e\u5730\u5740\r\n#define ds1302_year_add\t\t\t0x8c\t\t\/\/\u5e74\u6570\u636e\u5730\u5740\r\n#define ds1302_control_add\t\t0x8e\t\t\/\/\u63a7\u5236\u6570\u636e\u5730\u5740\r\n#define ds1302_charger_add\t\t0x90 \t\t\t\t\t \r\n#define ds1302_clkburst_add\t\t0xbe\r\n \r\n\/\/\u521d\u59cb\u65f6\u95f4\u5b9a\u4e49\r\nstatic unsigned char time_buf&#91;8] = {0x20,0x10,0x06,0x01,0x23,0x59,0x55,0x02};\/\/\u521d\u59cb\u65f6\u95f42010\u5e746\u67081\u53f723\u70b959\u520655\u79d2 \u661f\u671f\u4e8c\r\n \r\nstatic unsigned char readtime&#91;14];\/\/\u5f53\u524d\u65f6\u95f4\r\nstatic unsigned char sec_buf=0;   \/\/\u79d2\u7f13\u5b58\r\nstatic unsigned char sec_flag=0;  \/\/\u79d2\u6807\u5fd7\u4f4d\r\n \r\n \r\n\/\/\u5411DS1302\u5199\u5165\u4e00\u5b57\u8282\u6570\u636e\r\nstatic void ds1302_write_byte(unsigned char addr, unsigned char d) \r\n{\r\n\tunsigned char i;\r\n\tgpio_set_value(EXYNOS4_GPB(6), 1);\t\t\t\t\t\/\/\u542f\u52a8DS1302\u603b\u7ebf\t\r\n\t\/\/\u5199\u5165\u76ee\u6807\u5730\u5740\uff1aaddr\r\n\taddr = addr &amp; 0xFE;   \/\/\u6700\u4f4e\u4f4d\u7f6e\u96f6\uff0c\u5bc4\u5b58\u56680\u4f4d\u4e3a0\u65f6\u5199\uff0c\u4e3a1\u65f6\u8bfb\r\n\tfor(i=0;i&lt;8;i++)\r\n\t{\r\n\t\tif(addr&amp;0x01){gpio_set_value(EXYNOS4_GPB(5), 1);}\r\n\t\telse{gpio_set_value(EXYNOS4_GPB(5), 0);}\r\n\t\tgpio_set_value(EXYNOS4_GPB(4), 1);      \/\/\u4ea7\u751f\u65f6\u949f\r\n\t\tgpio_set_value(EXYNOS4_GPB(4), 0);\r\n\t\taddr=addr >> 1;\r\n\t}\r\n\t\r\n\t\/\/\u5199\u5165\u6570\u636e\uff1ad\r\n\tfor(i=0;i&lt;8;i++)\r\n\t{\r\n\t\tif(d &amp; 0x01) {gpio_set_value(EXYNOS4_GPB(5), 1);}\r\n\t\telse {gpio_set_value(EXYNOS4_GPB(5), 0);}\r\n\t\tgpio_set_value(EXYNOS4_GPB(4), 1);    \/\/\u4ea7\u751f\u65f6\u949f\r\n\t\tgpio_set_value(EXYNOS4_GPB(4), 0);\r\n\t\td = d >> 1;\r\n\t}\r\n\tgpio_set_value(EXYNOS4_GPB(6), 0);\t\t\/\/\u505c\u6b62DS1302\u603b\u7ebf\r\n}\r\n \r\n\/\/\u4eceDS1302\u8bfb\u51fa\u4e00\u5b57\u8282\u6570\u636e\r\nstatic unsigned char ds1302_read_byte(unsigned char addr)\r\n{\r\n\tunsigned char i,temp;\t\r\n\tgpio_set_value(EXYNOS4_GPB(6), 1);\/\/\u542f\u52a8DS1302\u603b\u7ebf\r\n\t\/\/\u5199\u5165\u76ee\u6807\u5730\u5740\uff1aaddr\r\n\taddr=addr | 0x01;    \/\/\u6700\u4f4e\u4f4d\u7f6e\u9ad8\uff0c\u5bc4\u5b58\u56680\u4f4d\u4e3a0\u65f6\u5199\uff0c\u4e3a1\u65f6\u8bfb\r\n\tfor(i=0; i&lt;8; i++)\r\n\t{\r\n\t\tif(addr &amp; 0x01){gpio_set_value(EXYNOS4_GPB(5), 1);}\r\n\t\telse {gpio_set_value(EXYNOS4_GPB(5), 0);}\r\n\t\tgpio_set_value(EXYNOS4_GPB(4), 1);\r\n\t\tgpio_set_value(EXYNOS4_GPB(4), 0);\r\n\t\taddr=addr >> 1;\r\n\t}\r\n\t\t\t\r\n\ts3c_gpio_cfgpin(EXYNOS4_GPB(5), S3C_GPIO_INPUT);   \/\/\u8f93\u5165\u6a21\u5f0f\r\n\t\/\/\u8f93\u51fa\u6570\u636e\uff1atemp\r\n\tfor(i=0; i&lt;8; i++)\r\n\t{\r\n\t\ttemp=temp>>1;\r\n\t\tif(gpio_get_value(EXYNOS4_GPB(5))){temp |= 0x80;}\r\n\t\telse{temp&amp;=0x7F;}\r\n\t\tgpio_set_value(EXYNOS4_GPB(4), 1);\r\n\t\tgpio_set_value(EXYNOS4_GPB(4), 0);\r\n\t}\r\n\ts3c_gpio_cfgpin(EXYNOS4_GPB(5), S3C_GPIO_OUTPUT);  \/\/\u8f93\u51fa\u6a21\u5f0f\r\n\tgpio_set_value(EXYNOS4_GPB(6), 0);\t\t\t\t\t\/\/\u505c\u6b62DS1302\u603b\u7ebf\r\n\treturn temp;\r\n}\r\n \r\n\/\/\u5411DS302\u5199\u5165\u65f6\u949f\u6570\u636e\r\nstatic void ds1302_write_time(struct rtc_time *time) \r\n{\r\n\tds1302_write_byte(ds1302_control_add,0x00);\t\t\t\t\/\/\u5173\u95ed\u5199\u4fdd\u62a4 \r\n\tds1302_write_byte(ds1302_sec_add,0x80);\t\t\t\t\t\/\/\u6682\u505c\u65f6\u949f \r\n\t\/\/ds1302_write_byte(ds1302_charger_add,0xa9);\t    \t\/\/\u6d93\u6d41\u5145\u7535\r\n\t\/*\u8bbe\u7f6eRTC\u65f6\u95f4*\/\r\n\t\r\n\t\/\/\u56e0\u4e3aDS1302\u7684\u5e74\u4efd\u53ea\u80fd\u8bbe\u7f6e\u540e\u4e24\u4f4d\uff0c\u6240\u6709\u9700\u8981\u4f7f\u7528\u6b63\u5e38\u7684\u5e74\u4efd\u51cf\u53bb2000\uff0c\u5f97\u5230\u5b9e\u9645\u7684\u540e\u4e24\u4f4d\r\n\tds1302_write_byte(ds1302_year_add,RTC_bin2bcd(time->tm_year-2000));\t\t\/\/\u5e74 \r\n\tds1302_write_byte(ds1302_month_add,RTC_bin2bcd(time->tm_mon));\t\t\/\/\u6708 \r\n\tds1302_write_byte(ds1302_date_add,RTC_bin2bcd(time->tm_mday));\t\t\/\/\u65e5 \r\n\tds1302_write_byte(ds1302_hr_add,RTC_bin2bcd(time->tm_hour));\t\t\/\/\u65f6 \r\n\tds1302_write_byte(ds1302_min_add,RTC_bin2bcd(time->tm_min));\t\t\/\/\u5206\r\n\tds1302_write_byte(ds1302_sec_add,RTC_bin2bcd(time->tm_sec));\t\t\/\/\u79d2\r\n\t\/\/ds1302_write_byte(ds1302_day_add,RTC_bin2bcd(time->tm_wday));\t\t\/\/\u5468  time->tm_wday\u4e00\u5468\u4e2d\u7684\u67d0\u4e00\u5929\r\n\tds1302_write_byte(ds1302_control_add,0x80);\t\t\t   \/\/\u6253\u5f00\u5199\u4fdd\u62a4     \r\n}\r\n \r\n \r\nstatic int DS1302_rtc_ioctl(struct device *dev, unsigned int cmd,unsigned long arg)\r\n{\r\n\t\/*\u8bbe\u7f6eRTC\u65f6\u95f4*\/\r\n\tstruct rtc_time time;\r\n\tcopy_from_user(&amp;time,(const void __user *)arg,sizeof(struct rtc_time));\r\n\tds1302_write_time(&amp;time);\r\n\treturn 0;\r\n}\r\n \r\n \r\n\/\/\u6b64\u51fd\u6570\u901a\u8fc7\u5e94\u7528\u5c42\u7684ioctl\u7684RTC_RD_TIME\u547d\u4ee4\u8fdb\u884c\u8c03\u7528\r\nstatic int tiny4412_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)\r\n{\r\n\trtc_tm->tm_year=RTC_bcd2bin(ds1302_read_byte(ds1302_year_add))+2000;   \/\/\u5e74 \r\n\trtc_tm->tm_mon=RTC_bcd2bin(ds1302_read_byte(ds1302_month_add));   \/\/\u6708 \r\n\trtc_tm->tm_mday=RTC_bcd2bin(ds1302_read_byte(ds1302_date_add));   \/\/\u65e5 \r\n\trtc_tm->tm_hour=RTC_bcd2bin(ds1302_read_byte(ds1302_hr_add));\t\t\/\/\u65f6 \r\n\trtc_tm->tm_min=RTC_bcd2bin(ds1302_read_byte(ds1302_min_add));\t\t\/\/\u5206 \r\n\trtc_tm->tm_sec=RTC_bcd2bin((ds1302_read_byte(ds1302_sec_add))&amp;0x7f);\/\/\u79d2\uff0c\u5c4f\u853d\u79d2\u7684\u7b2c7\u4f4d\uff0c\u907f\u514d\u8d85\u51fa59\r\n\t\/\/time_buf&#91;7]=ds1302_read_byte(ds1302_day_add);\t\t\/\/\u5468 \r\n\treturn 0;\r\n}\r\n \r\n \r\n\/\/\u6b64\u51fd\u6570\u901a\u8fc7\u5e94\u7528\u5c42\u7684ioctl\u7684RTC_SET_TIME\u547d\u4ee4\u8fdb\u884c\u8c03\u7528\r\nstatic int tiny4412_rtc_settime(struct device *dev, struct rtc_time *tm)\r\n{\r\n\tds1302_write_time(tm); \r\n\treturn 0;\t\r\n}\r\n \r\n \r\n\/*RTC\u6587\u4ef6\u64cd\u4f5c*\/\r\nstatic const struct rtc_class_ops DS1302_rtcops = {\r\n\t.ioctl=DS1302_rtc_ioctl,\r\n\t.read_time\t= tiny4412_rtc_gettime,\r\n\t.set_time\t= tiny4412_rtc_settime\r\n};\r\n \r\n \r\nstatic struct rtc_device *rtc=NULL;\r\n\/*\u5f53\u8bbe\u5907\u5339\u914d\u6210\u529f\u6267\u884c\u7684\u51fd\u6570-\u8d44\u6e90\u63a2\u67e5\u51fd\u6570*\/\r\nstatic int drv_probe(struct platform_device *pdev)\r\n{\t\r\n\trtc = rtc_device_register(\"DS1302RTC\",&amp;pdev->dev, &amp;DS1302_rtcops,THIS_MODULE);\r\n\tif(rtc==NULL)\r\n\tprintk(\"RTC\u9a71\u52a8\u6ce8\u518c\u5931\u8d251\\n\");\r\n\telse\r\n  \t{\r\n  \t\tprintk(\"RTC\u9a71\u52a8\u6ce8\u518c\u6210\u529f1\\n\");\r\n  \t}\r\n\t\r\n\t\/*1. \u521d\u59cb\u5316GPIO\u53e3*\/\r\n\tDS1302IO_Init();\r\n\tmsleep(10);\t\r\n\treturn 0;\r\n}\r\n \r\n \r\nstatic int drv_remove(struct platform_device *dev)\/*\u5f53\u8bbe\u5907\u5378\u8f7d\u540e\u8c03\u7528\u8fd9\u6761\u51fd\u6570*\/\r\n{\r\n\t\/*\u91ca\u653eGPIO\u53e3*\/\r\n\tgpio_free(EXYNOS4_GPB(4));\r\n\tgpio_free(EXYNOS4_GPB(5));\r\n\tgpio_free(EXYNOS4_GPB(6));\r\n\t\r\n\trtc_device_unregister(rtc);\r\n\tprintk(\"RTC\u9a71\u52a8\u5378\u8f7d\u6210\u529f\\n\");\r\n\treturn 0;\r\n}\r\n \r\n \r\n\/*\u5e73\u53f0\u8bbe\u5907\u9a71\u52a8\u7aef\u7ed3\u6784\u4f53-\u5305\u542b\u548cprobe\u5339\u914d\u7684\u8bbe\u5907\u540d\u5b57*\/\r\nstruct platform_driver  drv= \r\n{\r\n\t.probe = drv_probe,    \/*\u9700\u8981\u521b\u5efa\u4e00\u4e2aprobe\u51fd\u6570\uff0c\u8fd9\u4e2a\u51fd\u6570\u662f\u5bf9\u8bbe\u5907\u8fdb\u884c\u64cd\u4f5c*\/\r\n\t.remove = drv_remove,  \/*\u521b\u5efa\u4e00\u4e2aremove\u51fd\u6570\uff0c\u7528\u4e8e\u8bbe\u5907\u9000\u51fa*\/\r\n\t.driver = \r\n\t{\r\n\t\t.name = \"DS1302rtc\",    \/*\u8bbe\u5907\u540d\u79f0,\u7528\u6765\u4e0e\u8bbe\u5907\u7aef\u5339\u914d(\u975e\u5e38\u91cd\u8981)*\/\r\n\t},\r\n};\r\n \r\n\/*\u5e73\u53f0\u9a71\u52a8\u7aef\u7684\u5165\u53e3\u51fd\u6570*\/\r\nstatic int __init plat_drv_init(void)\r\n{\r\n\tplatform_driver_register(&amp;drv);\/*\u6ce8\u518c\u5e73\u53f0\u9a71\u52a8*\/\t\r\n\treturn 0;\r\n}\r\n \r\n\/*\u5e73\u53f0\u9a71\u52a8\u7aef\u7684\u51fa\u53e3\u51fd\u6570*\/\r\nstatic void __exit plat_drv_exit(void)\r\n{\r\n\tplatform_driver_unregister(&amp;drv);\/*\u91ca\u653e\u5e73\u53f0\u9a71\u52a8*\/\r\n}\r\n \r\nmodule_init(plat_drv_init);  \/*\u9a71\u52a8\u6a21\u5757\u7684\u5165\u53e3*\/\r\nmodule_exit(plat_drv_exit);  \/*\u9a71\u52a8\u6a21\u5757\u7684\u51fa\u53e3*\/\r\nMODULE_LICENSE(\"GPL\");       \/*\u9a71\u52a8\u7684\u8bb8\u53ef\u8bc1-\u58f0\u660e*\/<\/code><\/pre>\n\n\n\n<p><strong>DS1320\u8bbe\u5907\u7aef\u4ee3\u7801<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> \r\n#include \"linux\/module.h\"\r\n#include \"linux\/init.h\"\r\n#include &lt;linux\/platform_device.h>\r\n\/*\r\n * device  \u8bbe\u5907\u7aef\r\n *\/\r\n \r\n\/\/\u91ca\u653e\u5e73\u53f0\u603b\u7ebf\r\nstatic void pdev_release(struct device *dev)\r\n{\r\n\tprintk(\"rtc_pdev:the rtc_pdev is close!!!\\n\");\r\n}\r\n \r\n\/*\u8bbe\u5907\u7aef\u7ed3\u6784\u4f53*\/\r\nstruct platform_device  rtc_pdev= \/*\u8bbe\u5907\u7ed3\u6784\u4f53\uff0c\u8bbe\u5907\u540d\u5b57\u5f88\u91cd\u8981!*\/\r\n{\r\n\t.name = \"DS1302rtc\",  \/*\u8bbe\u5907\u540d*\/\r\n\t.id = -1,         \/*-1\u8868\u793a\u521b\u5efa\u6210\u529f\u540e\u8fd9\u8fb9\u8bbe\u5907\u7684\u540d\u5b57\u5c31\u53ebmyled\uff0c\u82e5\u8be5\u503c\u4e3a0\uff0c1\u5219\u8bbe\u5907\u540d\u662fmyled.0,myled.1...*\/\r\n\t.dev =            \/*\u9a71\u52a8\u5378\u8f7d\u65f6\u8c03\u7528*\/\r\n\t{\r\n\t\t.release = pdev_release,\/*\u91ca\u653e\u8d44\u6e90*\/\r\n\t},\r\n};\r\n \r\n \r\n\/*\u5e73\u53f0\u8bbe\u5907\u7aef\u5165\u53e3\u51fd\u6570*\/\r\nstatic int __init plat_dev_init(void)\r\n{\r\n\tplatform_device_register(&amp;rtc_pdev);\/*\u6ce8\u518c\u5e73\u53f0\u8bbe\u5907\u7aef*\/\r\n\treturn 0;\r\n}\r\n \r\n\/*\u5e73\u53f0\u8bbe\u5907\u7aef\u51fa\u53e3\u51fd\u6570*\/\r\nstatic void __exit plat_dev_exit(void)\r\n{\r\n\tplatform_device_unregister(&amp;rtc_pdev);\/*\u6ce8\u9500\u5e73\u53f0\u8bbe\u5907\u7aef*\/\r\n}\r\n \r\nmodule_init(plat_dev_init);\r\nmodule_exit(plat_dev_exit);\r\nMODULE_LICENSE(\"GPL\");<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<div class=\"slide-text-bg2\">\n<h3>1.1 Linux\u4e0bRTC\u65f6\u95f4\u7684\u8bfb\u5199\u5206\u6790<\/h3>\n<\/div>\n<div class=\"flex-btn-div\"><a href=\"http:\/\/www.recologypower.com:9080\/?p=959\" class=\"btn1 flex-btn\">\u9605\u8bfb\u66f4\u591a<\/a><\/div>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[110],"tags":[],"_links":{"self":[{"href":"http:\/\/www.recologypower.com:9080\/index.php?rest_route=\/wp\/v2\/posts\/959"}],"collection":[{"href":"http:\/\/www.recologypower.com:9080\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.recologypower.com:9080\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.recologypower.com:9080\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.recologypower.com:9080\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=959"}],"version-history":[{"count":1,"href":"http:\/\/www.recologypower.com:9080\/index.php?rest_route=\/wp\/v2\/posts\/959\/revisions"}],"predecessor-version":[{"id":968,"href":"http:\/\/www.recologypower.com:9080\/index.php?rest_route=\/wp\/v2\/posts\/959\/revisions\/968"}],"wp:attachment":[{"href":"http:\/\/www.recologypower.com:9080\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=959"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.recologypower.com:9080\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=959"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.recologypower.com:9080\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=959"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}