rtc(4)

الاسم
rtc - ساعة الوقت الحقيقي

موجز
#include <linux/rtc.h>

int ioctl(fd, RTC_request, param);

الوصف
هذه هي الواجهة لبرامج قيادة ساعات الوقت الحقيقي (RTCs).

تمتلك معظم الحواسيب ساعة عتادية واحدة أو أكثر تسجل وقت "ساعة الحائط" الحالي. تُسمى هذه الساعات "ساعات الوقت الحقيقي" (RTCs). عادة ما تمتلك إحداها طاقة احتياطية من بطارية لكي تتبع الوقت حتى عندما يكون الحاسوب مطفأً. توفر ساعات الوقت الحقيقي غالباً منبهات ومقاطعات أخرى.

تمتلك جميع الحواسيب الشخصية بمعمارية i386، والأنظمة القائمة على ACPI، ساعة وقت حقيقي متوافقة مع شريحة Motorola MC146818 الموجودة في أجهزة PC/AT الأصلية. في هذه الأيام، عادة ما تُدمج ساعة الوقت الحقيقي هذه في طقم رقائق اللوحة الرئيسة (الجسر الجنوبي)، وتستخدم بطارية احتياطية قابلة للاستبدال بحجم العملة المعدنية.

تستخدم الأنظمة غير المتوافقة مع الحاسوب الشخصي، مثل الأنظمة المدمجة المبنية حول معالجات النظام على شريحة (system-on-chip)، تنفيذات أخرى. وعادة لا توفر نفس الوظائف التي توفرها ساعة الوقت الحقيقي في أجهزة PC/AT.

  ساعة الوقت الحقيقي مقابل ساعة النظام
ينبغي عدم الخلط بين ساعات الوقت الحقيقي وساعة النظام، وهي ساعة برمجية تديرها النواة وتُستخدم لتنفيذ gettimeofday(2) و time(2)، بالإضافة إلى تعيين الطوابع الزمنية على الملفات، وما إلى ذلك. تبلغ ساعة النظام عن الثواني والميكروثانية منذ نقطة البداية، المعرفة بأنها حقبة بوسيكس (POSIX Epoch): 1970-01-01 00:00:00 +0000 (UTC). (يقوم أحد التنفيذات الشائعة بعد مقاطعات الموقت، مرة واحدة لكل "طرفة" (jiffy)، بتردد 100 أو 250 أو 1000 هرتز). أي أنه من المفترض أن تبلغ عن وقت ساعة الحائط، وهو ما تفعله ساعات الوقت الحقيقي أيضًا.

يتمثل الفرق الرئيس بين ساعة الوقت الحقيقي وساعة النظام في أن ساعات الوقت الحقيقي تعمل حتى عندما يكون النظام في حالة طاقة منخفضة (بما في ذلك حالة "الإيقاف")، بينما لا تستطيع ساعة النظام ذلك. لا يمكن لساعة النظام، حتى تُهيئة، إلا الإبلاغ عن الوقت منذ إقلاع النظام، وليس منذ حقبة بوسيكس. لذا عند وقت الإقلاع، وبعد الاستئناف من حالة طاقة منخفضة للنظام، غالباً ما تُضبط ساعة النظام على وقت ساعة الحائط الحالي باستخدام ساعة الوقت الحقيقي. تحتاج الأنظمة التي لا تملك ساعة وقت حقيقي إلى ضبط ساعة النظام باستخدام ساعة أخرى، ربما عبر الشبكة أو بإدخال تلك البيانات يدوياً.

  وظائف ساعة الوقت الحقيقي
يمكن قراءة ساعات الوقت الحقيقي والكتابة إليها باستخدام hwclock(8)، أو مباشرة باستخدام طلبات ioctl(2) المدرجة أدناه.

إلى جانب تتبع التاريخ والوقت، يمكن للعديد من ساعات الوقت الحقيقي أيضًا توليد مقاطعات

•   عند كل تحديث للساعة (أي مرة واحدة في الثانية)؛

•   على فترات دورية بتردد يمكن ضبطه على أي مضاعف للقوة 2 في النطاق من 2 هرتز إلى 8192 هرتز؛

•   عند الوصول إلى وقت منبه محدد مسبقاً.

يمكن تفعيل أو تعطيل كل مصدر من مصادر المقاطعة هذه بشكل منفصل. في العديد من الأنظمة، يمكن ضبط مقاطعة المنبه كحدث استيقاظ للنظام، والذي يمكنه استئناف النظام من حالة طاقة منخفضة مثل التعليق إلى الذاكرة (STR، ويسمى S3 في أنظمة ACPI)، أو السبات (يسمى S4 في أنظمة ACPI)، أو حتى حالة "الإيقاف" (تسمى S5 في أنظمة ACPI). في بعض الأنظمة، لا تستطيع ساعة الوقت الحقيقي المدعومة بالبطارية إصدار مقاطعات، ولكن يمكن لساعة أخرى القيام بذلك.

يمكن فتح جهاز /dev/rtc (أو /dev/rtc0، /dev/rtc1، إلخ) مرة واحدة فقط (حتى يُغلق) وهو للقراءة فقط. عند استدعاء read(2) و select(2)، تُعطل العملية المستدعِية حتى تُستقبل المقاطعة التالية من ساعة الوقت الحقيقي تلك. بعد المقاطعة، يمكن للعملية قراءة عدد صحيح طويل (long integer)، يحتوي البايت الأقل أهمية فيه على قناع بت يشفر أنواع المقاطعات التي حدثت، بينما تحتوي البايتات الثلاثة المتبقية على عدد المقاطعات منذ آخر read(2).

  واجهة ioctl(2)
تُعرف طلبات ioctl(2) التالية على واصفات الملفات المتصلة بأجهزة ساعات الوقت الحقيقي:

RTC_RD_TIME
    يعيد وقت ساعة الوقت الحقيقي هذه في الهيكل التالي:

        struct rtc_time {
            int tm_sec;
            int tm_min;
            int tm_hour;
            int tm_mday;
            int tm_mon;
            int tm_year;
            int tm_wday;     /* غير مستخدم */
            int tm_yday;     /* غير مستخدم */
            int tm_isdst;    /* غير مستخدم */
        };

    تمتلك الحقول في هذا الهيكل نفس المعنى والنطاقات الخاصة بهيكل tm الموصوف في gmtime(3). يجب تمرير مؤشر إلى هذا الهيكل كمعامل ثالث لـ ioctl(2).

RTC_SET_TIME
    يضبط وقت ساعة الوقت الحقيقي هذه على الوقت المحدد بواسطة هيكل rtc_time الذي يشير إليه المعامل الثالث لـ ioctl(2). لضبط وقت ساعة الوقت الحقيقي، يجب أن تكون العملية ذات صلاحيات (أي تمتلك قدرة CAP_SYS_TIME).

RTC_ALM_READ
RTC_ALM_SET
    قراءة وضبط وقت المنبه، لساعات الوقت الحقيقي التي تدعم المنبهات. يجب تفعيل أو تعطيل مقاطعة المنبه بشكل منفصل باستخدام طلبات RTC_AIE_ON و RTC_AIE_OFF. المعامل الثالث لـ ioctl(2) هو مؤشر إلى هيكل rtc_time. تُستخدم حقول tm_sec و tm_min و tm_hour فقط من هذا الهيكل.

RTC_IRQP_READ
RTC_IRQP_SET
    قراءة وضبط تردد المقاطعات الدورية، لساعات الوقت الحقيقي التي تدعم المقاطعات الدورية. يجب تفعيل أو تعطيل المقاطعة الدورية بشكل منفصل باستخدام طلبات RTC_PIE_ON و RTC_PIE_OFF. المعامل الثالث لـ ioctl(2) هو unsigned long * أو unsigned long، على التوالي. القيمة هي التردد بالمقاطعات في الثانية. مجموعة الترددات المسموح بها هي مضاعفات الرقم اثنين في النطاق من 2 إلى 8192. يمكن فقط لعملية ذات صلاحيات (أي تمتلك قدرة CAP_SYS_RESOURCE) ضبط ترددات أعلى من القيمة المحددة في /proc/sys/dev/rtc/max-user-freq. (يحتوي هذا الملف على القيمة 64 مبدئياً).

RTC_AIE_ON
RTC_AIE_OFF
    تفعيل أو تعطيل مقاطعة المنبه، لساعات الوقت الحقيقي التي تدعم المنبهات. يتم تجاهل المعامل الثالث لـ ioctl(2).

RTC_UIE_ON
RTC_UIE_OFF
    تفعيل أو تعطيل المقاطعة عند كل تحديث للساعة، لساعات الوقت الحقيقي التي تدعم هذه المقاطعة التي تحدث مرة واحدة في الثانية. يتم تجاهل المعامل الثالث لـ ioctl(2).

RTC_PIE_ON
RTC_PIE_OFF
    تفعيل أو تعطيل المقاطعة الدورية، لساعات الوقت الحقيقي التي تدعم هذه المقاطعات الدورية. يتم تجاهل المعامل الثالث لـ ioctl(2). يمكن فقط لعملية ذات صلاحيات (أي تمتلك قدرة CAP_SYS_RESOURCE) تفعيل المقاطعة الدورية إذا كان التردد مضبوطاً حالياً فوق القيمة المحددة في /proc/sys/dev/rtc/max-user-freq.

RTC_EPOCH_READ
RTC_EPOCH_SET
    تشفر العديد من ساعات الوقت الحقيقي السنة في سجل 8 بت يُفسر إما كعدد ثنائي 8 بت أو كعدد BCD. في كلتا الحالتين، يُفسر الرقم بالنسبة إلى حقبة ساعة الوقت الحقيقي هذه. تُهيئة حقبة ساعة الوقت الحقيقي إلى 1900 في معظم الأنظمة، ولكن في معالجات Alpha و MIPS قد تُهيئة أيضًا إلى 1952 أو 1980 أو 2000، اعتماداً على قيمة سجل ساعة الوقت الحقيقي للسنة. مع بعض ساعات الوقت الحقيقي، يمكن استخدام هذه العمليات لقراءة أو ضبط حقبة ساعة الوقت الحقيقي، على التوالي. المعامل الثالث لـ ioctl(2) هو unsigned long * أو unsigned long، على التوالي، والقيمة المعادة (أو المسندة) هي الحقبة. لضبط حقبة ساعة الوقت الحقيقي، يجب أن تكون العملية ذات صلاحيات (أي تمتلك قدرة CAP_SYS_TIME).

RTC_WKALM_RD
RTC_WKALM_SET
    تدعم بعض ساعات الوقت الحقيقي واجهة منبه أكثر قوة، باستخدام طلبات ioctls هذه لقراءة أو كتابة وقت منبه ساعة الوقت الحقيقي (على التوالي) باستخدام هذا الهيكل:

        struct rtc_wkalrm {
            unsigned char enabled;
            unsigned char pending;
            struct rtc_time time;
        };

    تُستخدم علامة enabled لتفعيل أو تعطيل مقاطعة المنبه، أو لقراءة حالتها الحالية؛ عند استخدام هذه الاستدعاءات، لا تُستخدم RTC_AIE_ON و RTC_AIE_OFF. تُستخدم علامة pending بواسطة RTC_WKALM_RD للإبلاغ عن مقاطعة معلقة (لذا فهي غير مفيدة تقريباً في لينكس، إلا عند التحدث إلى ساعة الوقت الحقيقي التي تديرها برمجية EFI الثابتة). حقل time هو نفسه المستخدم مع RTC_ALM_READ و RTC_ALM_SET باستثناء أن حقول tm_mday و tm_mon و tm_year صالحة أيضًا. يجب تمرير مؤشر إلى هذا الهيكل كمعامل ثالث لـ ioctl(2).

الملفات

/dev/rtc
/dev/rtc0
/dev/rtc1
...
    ملفات أجهزة المحارف الخاصة بساعة الوقت الحقيقي.

/proc/driver/rtc
    حالة ساعة الوقت الحقيقي (الأولى).

ملاحظات
عندما يُزامن وقت نظام النواة مع مرجع خارجي باستخدام adjtimex(2)، فإنه سيحدث ساعة وقت حقيقي محددة دورياً كل 11 دقيقة. للقيام بذلك، يتعين على النواة إيقاف المقاطعات الدورية لفترة وجيزة؛ قد يؤثر هذا على البرامج التي تستخدم ساعة الوقت الحقيقي تلك.

ليس لحقبة ساعة الوقت الحقيقي أي علاقة بحقبة بوسيكس التي تُستخدم فقط لساعة النظام.

إذا كانت السنة وفقاً لحقبة ساعة الوقت الحقيقي وسجل السنة أقل من 1970، فيُفترض أنها بعد 100 عام، أي بين عامي 2000 و 2069.

تدعم بعض ساعات الوقت الحقيقي قيم "الجوكر" في حقول المنبه، لدعم سيناريوهات مثل المنبهات الدورية عند الدقيقة الخامسة عشرة بعد كل ساعة، أو في اليوم الأول من كل شهر. مثل هذا الاستخدام غير محمول؛ تتوقع أكواد فضاء المستخدم المحمولة مقاطعة منبه واحدة فقط، وستقوم إما بتعطيل المنبه أو إعادة تهيئته بعد استقباله.

تدعم بعض ساعات الوقت الحقيقي المقاطعات الدورية بفترات هي مضاعفات للثانية بدلاً من أجزاء من الثانية؛ ومنبهات متعددة؛ وإشارات ساعة خرج قابلة للبرمجة؛ وذاكرة غير متطايرة؛ وقدرات عتادية أخرى لا تظهر حالياً بواسطة هذه الواجهة البرمجية.

انظر أيضًا
date(1), adjtimex(2), gettimeofday(2), settimeofday(2), stime(2), time(2), gmtime(3), time(7), hwclock(8)

Documentation/rtc.rst في شجرة مصدر نواة لينكس

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.