i2ctransfer(8) System Manager's Manual i2ctransfer(8)

i2ctransfer - ارسال پیام‌های کاربر I2C در یک انتقال ترکیبی

i2ctransfer [-a] [-b] [-f] [-v] [-y] i2cbus desc [data] [desc [data]] ...
i2ctransfer -h
i2ctransfer -V

دستور i2ctransfer برنامه‌ای برای ایجاد پیام‌های I2C و ارسال آن‌ها به‌صورت ترکیب‌شده در قالب یک انتقال است. برای پیام‌های خواندن، محتویات بافرهای دریافتی در خروجی استاندارد (stdout)، یک خط به ازای هر پیام خواندن، چاپ می‌شوند.
لطفاً به تفاوت میان یک انتقال (transfer) و یک پیام (message) در اینجا توجه کنید. یک انتقال می‌تواند شامل چندین پیام باشد و همان‌طور که در مشخصات I2C توصیف شده است، با یک وضعیت START آغاز و با یک وضعیت STOP خاتمه می‌یابد. پیام‌های درون انتقال با استفاده از وضعیت REPEATED START که آن هم در مشخصات آمده، به یکدیگر زنجیر می‌شوند. داشتن چندین پیام در یک انتقال مزایایی به همراه دارد. نخست، برخی دستگاه‌ها حالت‌های داخلی خود را برای REPEATED START حفظ می‌کنند اما پس از یک STOP آن‌ها را بازنشانی (reset) می‌نمایند. دوم، در طول یک انتقال نمی‌توان در کار شما وقفه ایجاد کرد، اما ممکن است بین چندین انتقال وقفه بیفتد. وقفه می‌تواند در سطح سخت‌افزار توسط یک master دیگر I2C روی گذرگاه (bus)، یا در سطح نرم‌افزار توسط کاربر دیگری از I2C که انتقالش بین انتقال‌های شما زمان‌بندی شده، رخ دهد. این برنامه به شما کمک می‌کند تا انتقال‌های مناسبی را متناسب با نیازهای خود ایجاد کنید.

اجازه استفاده از آدرس‌های بین 0x00 - 0x07 و 0x78 - 0x7f را می‌دهد. توصیه نمی‌شود.
داده‌های پیام‌های خواندن را به صورت داده‌های باینری چاپ می‌کند. گزینه -v (پرگو یا verbose) را غیرفعال می‌سازد. برای انتقال با لوله‌کشی (pipe) به یک ابزار قالب‌بندی نمایش مانند hexdump یا هدایت به یک فایل جهت تحلیل بعدی مفید است.
دسترسی به دستگاه را حتی در صورتی که مشغول باشد، اجباری (force) می‌کند. به‌طور پیش‌فرض، i2ctransfer از دسترسی به دستگاهی که از قبل تحت کنترل یک درایور هسته (kernel driver) است خودداری می‌کند. استفاده از این فلگ خطرناک است و می‌تواند درایور مربوطه در هسته را به شدت دچار اختلال کند. همچنین می‌تواند باعث شود که i2ctransfer به صورت بی‌صدا در رجیستر اشتباهی بنویسد. بنابراین با مسئولیت خودتان و تنها در صورتی که می‌دانید چه کاری انجام می‌دهید از آن استفاده کنید.
نمایش راهنما و خروج.
فعال کردن خروجی با جزئیات (verbose). اطلاعات مربوط به تمامی پیام‌های ارسالی را چاپ می‌کند؛ یعنی نه تنها برای پیام‌های خواندن، بلکه برای پیام‌های نوشتن نیز اطلاعات را نمایش می‌دهد.
نمایش نسخه و خروج.
غیرفعال کردن حالت تعاملی. به‌طور پیش‌فرض، i2ctransfer قبل از دستکاری در گذرگاه I2C، منتظر تأیید از سوی کاربر می‌ماند. وقتی از این فلگ استفاده شود، عملیات را مستقیماً انجام می‌دهد. این گزینه عمدتاً برای استفاده در اسکریپت‌ها در نظر گرفته شده است.

پارامتر نخست i2cbus شماره یا نام گذرگاه I2C مورد استفاده را مشخص می‌کند. این شماره باید مطابق با یکی از گذرگاه‌های فهرست‌شده توسط i2cdetect -l باشد.

پارامتر بعدی یک یا چند بلوک desc است. تعداد بلوک‌ها توسط هسته لینوکس محدود شده و با I2C_RDWR_IOCTL_MAX_MSGS تعیین می‌شود (۴۲ مورد از نسخه v4.10). بلوک‌های desc به این شکل تشکیل می‌شوند:

{r|w}<length_of_message>[@address]

{r|w}
مشخص می‌کند که پیام خواندن است یا نوشتن
<length_of_message>
تعداد بایت‌های خوانده‌شده یا نوشته‌شده در این پیام را مشخص می‌کند. به عنوان یک عدد صحیح ۱۶ بیتی بدون علامت تجزیه می‌شود، اما توجه داشته باشید که هسته لینوکس یک حد بالای اضافی را نیز اعمال می‌کند (۸۱۹۲ از نسخه v4.10). برای پیام‌های خواندن به مقاصدی که از تراکنش‌های بلوکی SMBus پشتیبانی می‌کنند، می‌تواند مقدار '?' نیز باشد؛ در این حالت مقصد، طول را تعیین خواهد کرد.
[@address]
آدرس ۷ بیتی تراشه‌ای را که قرار است برای این پیام مورد دسترسی قرار گیرد مشخص می‌کند و یک عدد صحیح است. در صورت حذف، آدرس قبلی مجدداً استفاده می‌شود. به طور معمول، آدرس‌های خارج از محدوده 0x08-0x77 و آدرس‌هایی که یک درایور هسته به آن‌ها متصل است مسدود خواهند شد. این رفتار را می‌توان با -a (همگی) یا -f (اجباری) نادیده گرفت. هنگام استفاده از این گزینه‌ها بسیار مراقب باشید! آدرس‌های ۱۰ بیتی در حال حاضر به هیچ وجه پشتیبانی نمی‌شوند.

اگر پیام I2C از نوع نوشتن باشد، سپس یک بلوک data حاوی داده‌هایی که باید نوشته شوند به دنبال آن می‌آید. این بلوک از <length_of_message> بایت تشکیل شده است که می‌توانند با پیشوندهای معمول برای مبنای شانزدهی (hexadecimal)، هشت‌هشتی (octal) و غیره مشخص شوند. برای آسان‌تر کردن ساخت بلوک‌های داده بزرگ‌تر به صورت ساده، بایت داده می‌تواند یک پسوند داشته باشد.

=
مقدار را تا انتهای پیام ثابت نگه می‌دارد (به عنوان مثال 0= به معنای 0, 0, 0, ... است)
+
مقدار را تا انتهای پیام ۱ واحد افزایش می‌دهد (به عنوان مثال 0+ به معنای 0, 1, 2, ... است)
-
مقدار را تا انتهای پیام ۱ واحد کاهش می‌دهد (به عنوان مثال 0xff- به معنای 0xff, 0xfe, 0xfd, ... است)
استفاده از مقدار به عنوان seed برای یک توالی شبه‌تصادفی ۸ بیتی (به عنوان مثال 0p به معنای 0x00, 0x50, 0xb0, ... است)

روی گذرگاه ۰، از یک EEPROM در آدرس 0x50، خواندن ۸ بایت از آفست 0x64 (پیام اول یک بایت می‌نویسد تا اشاره‌گر حافظه را روی 0x64 تنظیم کند، پیام دوم از همان تراشه می‌خواند):

# i2ctransfer 0 w1@0x50 0x64 r8

برای همان EEPROM، در آفست 0x42 نوشتن مقادیر 0xff 0xfe ... 0xf0 (یک پیام نوشتن؛ بایت اول اشاره‌گر حافظه را روی 0x42 تنظیم می‌کند، 0xff اولین بایت داده است، تمام بایت‌های داده بعدی یک واحد کاهش می‌یابند):

# i2ctransfer 0 w17@0x50 0x42 0xff-

دستور i2ctransfer در صورت استفاده نادرست می‌تواند فوق‌العاده خطرناک باشد. می‌تواند گذرگاه I2C شما را دچار اختلال کند، موجب از دست رفتن داده‌ها شود یا اثرات جانبی جدی‌تری در پی داشته باشد. نوشتن روی یک EEPROM متوالی در یک ماژول حافظه DIMM (آدرس‌های تراشه بین 0x50 و 0x57) ممکن است حافظه شما را نابود کند و سیستم شما را غیرقابل بوت سازد! در استفاده از این برنامه به شدت احتیاط کنید.

برای گزارش اشکالات یا ارسال اصلاحات، لطفاً به لیست پستی I2C لینوکس به نشانی <linux-i2c@vger.kernel.org> همراه با رونوشت (Cc) به نگهدارنده فعلی بنویسید: Jean Delvare <jdelvare@suse.de>.

Wolfram Sang، بر پایه i2cget توسط Jean Delvare

این صفحه راهنما در ابتدا توسط Wolfram Sang بر پایه راهنمای i2cset توسط David Z Maze <dmaze@debian.org> نوشته شده است.

i2cdetect(8), i2cdump(8), i2cget(8), i2cset(8)

May 2022