امروز صبح خیلی اتفاقی مطلب “ماجرای درایورِ شبکه بهداد اسفهبد” رو خوندم که خیلی به نظرم جالب آمد و باعث شد که ماجرای اولین هک سخت افزار را که انجام دادم بنویسم، و فکر میکنم واقعا دارای نکات خیلی خوبی راجبه حل مساله است، این که شما بتونی به شکل جزیی به سیستم نگاه کنی و راه کار برای حل مساله داشته باشی خیلی مهمه! چیزی که الان خیلیها لازم دارن همین مساله است! این مهارت باعث میشود قادر باشید مشکلات متعدد موجود در یک پروژه بزرگ را حل کنید. من فکر میکنم برای حرفه ای شدن توی کاری که دارید انجام میدهیم نیاز نیست تمام ریزه کاریهای اون کار رو بدونیم هرچند دانستن جزییات خوب و راهگشاست! تنها نیازه که بدانید اگر مشکلی در کار به وجود آمد چطور میشود حلش کرد، یعنی برای حل آن مشکل راه حل داشته باشید، راهکار داشته باشید! بتوانید ایده پردازی کنید و ایدهها را از حالت ایده به واقعیت تبدیل کنید.
بذارید با یک مثال مساله را روشن کنم، فرض کنید شخصی قرار است نمایشگر گرافیکی ks0108 را راه اندازی کند، فرد مذکور ابتدا در اینترنت جستجو میکند و کتابخانهای برای مثلا میکروکنترلر Atmega16 پیدا میکند و بعد از دانلود، برنامه را در پروتئوس چک میکند و میبیند که کار هم میکند، بعد مدار لازم را میبندد و میکروکنترلر را پروگرام میکند و در کمال تعجب میبیند که مدار کار نمیکند!!
چند دقیقه مدار را بررسی میکند، سیمکشی را چک میکند ولتاژها رو میگیرد و وقتی نمیتواند متوجه شود چرا مدار کار نمیکند! کلافه و عصبانی میشود و در نهایت میگوید این کتابخانه کار نمیکند! یا lcd خراب است یا دلایلی از این دست و احتمالا یا کار رو کنار میذارد یا میرود دنبال یک کتابخانه یا برنامه دیگر بگردد و این مشکل همچنان حل نشده باقی میماند.
اما چطور باید با این مساله برخورد کرد؟، غالبا بیشتر مدارهای الکترونیکی در وحله اول کار نمیکنن:) این یه پیش فرضه و اگر کار کنن جای تعجب دارد، برای همین میگم مهارت شما در شکستن مسائل بزرگ به بخش های جزیی، شکستن چالش های بزرگ به چالش های کوچک در الکترونیک و هر نوع مساله دیگری خیلی مهم است و اصلا کلید موفقیت توی همین امر ساده است.
بذارید گذاره بالا را بیشتر بررسی کنیم برای این کار روند کار خودم در مواجه با چنین چالش هایی رو مثال میزنم.
در اولین قدم دیتاشیت نمایشگر را باز میکنم و کدهای ارسالی کتابخانه رو برای LCD با سیگنالینگ موجود در دیتاشیت چک میکنم و مطمئن میشوم که از آن بایت مشکلی وجود نداشته باشد، فرض میکنیم در این بخش مشکلی نیست.
در قدم بعدی، تک تک اتصالات را نقطه به نقطه با مولتیمتر چک میکنم و مطمئن میشوم که سیمها و سیمکشی کاملا درست باشد و مجددا فرض میکنم اینجا هم مشکلی دیده نمیشود.
گام بعدی این است که مطمئن شویم برنامه و پایههای انتخاب شده درست و هماهنگ هستند، برای این کار پایههای سیگنال را یک به یک چک میکنم، مثلا اول با تغییر توی برنامه پایه cs رو چشمک زن میکنم بعد با led چک میکنم ببینم واقعا چشمک میزنه و درست کار میکند، مجددا فرض میکنیم پایه های کنترلی هم هیچ مشکلی ندارن.
این بار به سراغ سیگنال دیتا میرویم، چون دیتای این نمایشگر ۸ بیت است از یک پورت برای انتقال دیتا ازش استفاده شده که فرضا PORTC میکرو است. اینم مثل سیگنال های کنترلی چک میکنم در کمال تعجب میبینم دیتا درست روی پورت قرار نمیگیرد. خوب تا اینجا ریشه مشکل رو پیدا کردیم! احتمالا چون دیتا درست روی باس نمایشگر قرار نمیگیرد راه اندازی نمیشود!
اما چرا دیتا درست روی باس قرار نمی گیرد ؟ شاید پورت میکرو سوخته است؟ شاید امپدانس lcd خیلی پایین است؟ و کلی دلیل دیگه…، همه را بررسی میکنم.
مثلا میکرو را عوض میکنیم، نمایشگر را در میآریم و …. میبینم که نه درست نشد! در انتها دست به دامن دیتاشیت میشوم و بررسی میکنم که این پورت از میکرو احتمال مثل پورت میکروی 8051 نیاز به پول آپ خارجی داره یا نه و گزینه های این چنینی رو بررسی کنیم! که میبنیم این پورت به شکل پیش فرض برای دیباگ Jtag استفاده میشود و دلیل کار نکردن همینه احتمالا.
فیوز بیت Jtag رو غیر فعال می کنیم و هوراا همه چی درست می شود.
و این میشود یه تجربه ارزشمند! همین تلاشهای مستمر و تجربههای کوچک میشود کوله باری از دانش و تجربه که در آینده هم برای خودمان مفید است و هم میتواند گره از کار دیگران باز کند. بارها پیش آمده است که دوستی قصد راه اندازی lcd با میکروهای atmega16 یا Atmega32 رو داشته به مشکل خورده است وقتی از من پرسیده است، اولین سوالم این بوده که از portc استفاده کردهاید؟ و غالبه جواب مثبت بوده.
انگار این بار مقدمه خیلی طولانی شد، اصلا قرار بود راجب یه چیز دیگه ای بنویسم! میخواستم اولین تجربه هک سخت افزار را بنویسم، برگردیم سر اصل مطلب.
ورود تلویزیونهای نیمه دیجیتال
قضیه برمیگردد به حدود ۲۰ سال پیش یا شاید هم بیشتر!، آن موقعها اگر خاطرتان باشد تلویزیونها کانالی بودند، یک چیزی مثل کلید سلکتورهای امروزی داشتند که مثلا یک عدد رو انتخاب میکردی بعد فرکانس رو برای آن عدد با یه مکانیسم مکانیکی تنظیم میکردیم!! مثلا عدد یک را میگذاشتم برای کانال یک، عدد دو را برای کانال دو و… اون مکانیسم چیزی بود مثل عکس زیر:
اگه کنجکاو هستید بدانید چطور کار می کرد این مکانیسم عکس زیر را ببینید که داخلش را نشان میدهد:
در واقع با انتخاب هر عدد کانال یک مجموعه از سلف و خازنها را انتخاب میکردید و قادر بودید ظرفیت سلف رو تغییر بدید برای کانالهای uhf ظرفیت خازن را عوض میکردید! حالا زیاد وارد جزییاتش نمیشوم برای درک عملکردش فیلم کوتاه زیر ببینید:
یا برای تنظیم هر کانال به شکل زیر عمل میکرد
در تلویزیون های نیمه دیجیتال (الان میگم نیمه دیجیتال در مقایسه با تلویزیون های دیجیتال امروزی اگر نه در زمان خودشون دیجیتال حساب میشدن) خوب اصلا مکانیسم انتخاب کانال این چنین نبود و همه چیز توسط قطعات الکترونیکی انجام میشد و تازه خود تلویزیون کانال یابی میکرد کلی امکانات دیجیتال داشت.
میشد بازیهایی که در حافظه تلویزیون بود را بازی کرد، ریموت مادون قرمز داشت و خلاصه یه دنیایی بود از تکنولوژیهای اون موقع.
لامپ تصویر (لامپ اشعه کاتدیک) همان بود و همه مکانیسم همان! ولی بخش های کنترلی دیجیتال شده بودند، کانالیابی بعدها تلتکس، حتی نمونههایی بود که بازی هم داشت، جذاب ترین قسمتش برای من سر در آوردن از مکانیسم کانالیابی خودکارش بود! همان جا بود که با دیودهای واریکاپ آشنا شدم.
جرقه اولین ایده برای هک سخت افزار
روزی که رفته بودم پیش یک دوست تعمیرکار، او ایده اولین هک زندگیم را در ذهنم انداحت. چند تا کلید یک تلویزیون رو با هم فشار داد بعد یهو یک منویی ظاهر شد که اطلاعات خیلی جالبی از تلویزیون نشان میداد.
مثل این که چقدر کار کرده است، چند بار روشن شده است، حتی یه سری تنظیمات برای رنگ و روشنایی داشت که توی تلویزیونهایی که لامپ تصویرشان ضعیف شده بود این پارامترها را دستکاری میکردند تا تصویر بهتری بگیرند!
گفت همه این تنظیمات توی یه حافظه کوچولو ذخیره میشود که اسمش 24c02 است و برخی تلویزیون ها این منو رو ندارن و مجبوریم آیسیش رو در بیاریم و بگذاریم روی یک تلویزیون که این تنظیمات رو داره رو تنظیم کنیم بعد برگردانیم سر جاش!، که همیشه هم بیدردسر نیست و ممکن است چندین بار سعی و خطا کنیم بسته به کیفیت لامپ تصویر و … تا نتیجه مناسب رو بگیرم. و گفت بیا از این تنظیمات سر در بیاریم که چی هستند و چطور ذخیره میشوند.
به نظرم خیلی جالب اومد!! واقعا میشه این کار رو کرد؟ اون موقع زیاد از دیجیتال اصولا از الکترونیک نمی فهمیدم (یه نوجوان دبیرستانی رو فرض کنید دیگه)، اما این ایده اینقدر گیرا بود برام که رفتم دنبالش.
برای هک سخت افزار از کجا و چطور شروع کردم
برای هک سخت افزار لازم است که خود سخت افزار رل داشته باشید پس یک آیسی ازش گرفتم و بدون آن که بدانم، چی به چی است و اصلا باید چکار کنم مستقیم رفتم کافینت! (اون موقع اینترنت مثل الان بود، تنها جایی که میشد بهش دسترسی داشت کافینت بود.) مستقیم رفتم سایت atmle و دیتاشیت این آیسی و چند تا مدل دیگه شبیهاش را دانلود کردم و ریختم روی فلاپی! (بله اون موقع استوریج قابل حمل همین یک مورد بود در مواردی هم که حجم خیلی زیاد بود cd رایت میکردیم) و رفتم خانه، احتمالا میدانید هزینه کافینت مقداری زیاد بود و سعی میکردم تا جای ممکن سریع هرچی را میخواهم جستجو کنم و حتی صفحه های وب را ذخیره میکردم که بعد سر فرصت مطالعه کنم، همه را ریختم روی دوتا فلاپی و رفتم خانه.
شروع امیدوار کننده بود، بیشتر پایه های آیسی زمین شده بود، یکی هم به VCC وصل شده بود، سه تا پایه دیگه بود. یکی برای write protect بود که تکلیفش روشن بود و دوتای دیگه هم به نظر خیلی پیچیده نمیآمد. یکی کلاک و یکی دیتا.
اما ای کاش همه چی به این سادگی بود. کلید جدید i2c بود! خوب الان هم توضیحش ساده نیست چه برسه اون موقع که خیلی هم از الکترونیک دیجیتال سر در نمیآوردم!! مثلا یک جایی خوانده بودم که در مورد این پروتکل نوشته بود یک پروتکل onboard است و برام سوال شده بود یعنی چی؟ اگه رو برد نباشه کار نمیکند؟ و از این دست سوال های مسخره
بعد از یک هفته مطالعه پروتکل و خیره شدن به شکل موجهای درج شده توی دیتاشیت قطعه و زیر و رو کردن دیتاشیت آیسی تقریبا دستم آمده بود باید چکار کنم پروتکل چطور کار میکند – آیسی چطور کار میکند باید چه کارهایی انجام بدهم خوب باید میرفتم در فاز عملی.
اما خوب همونطور که احتمالا میتونید حدس بزنید اون موقع میکروکنترلر موجود غریبهای بود و شناختی ازش نداشتم. پس راه حل چی بود؟
این پورتها چیه پشت کامپیوتر
همینطور که داشتم فکر میکردم که چطور میتوانم تست کنم و داشتم به استفاده از کلید و شیف رجیتسر فکر میکردم ، یکهو جرقهای در ذهنم خورد! آیا میشود از پورتهای کامپیوتر استفاده کرد؟
اول داشتم به پورت ps2 فکر میکردم چون پروتکل شبیه i2c بود (به لحاظ همزمانی و سریال بودن) ولی هیچ ایدهای برای این که چطور تو کامپیوتر باهاش کار کنم نداشتم و گذاشتمش کنار، گزینه بعدی پورت سریال بود، خوب راحت میشد یه سری پایه ها رو کنترل کرد ولی یک مشکلی وجود داشت، با مولتیمتر که میگرفتم ولتاژ پایهها را به نظرم منطقی نمیآمد یا 12 ولت بود یا منفی 12 ولت، گیج شده بودم و قیدش را زدم، پورت بعدی پورت پرینتر بود یا همون LPT.
خدا بیامرز ویندوز 98، اجازه دسترسی مستقیم به پورتها را میداد، یعنی تو آدرس پورت دیتا که مینوشتی روی درگاه سخت افزاری ظاهر میشد به همین خوشمزگی ? و خدا لعنت کنه ویندوز xp و ۲۰۰۰ رو که چنین نبودن آدرس های مجازی میساختن و کلان مکافات بود.
خیلی کم ویژوال بیسیک 6 یاد گرفته بودم و توانسته بودم با استفاده از یک dll که برای کار با سخت افزار نوشته شده بود ارتباط را با پورت LPT برقرار کنم یک led وصل کرده بودم به پورت lpt و با برنامه کوچیک میتوانستم خاموش و روشنش کنم. البته که با سادگی نوشتن این چند خط نبود و روزها درگیر تست و خطا بودم تا بلاخره موفق شدم، و وقتی کلید رو زدم و led روشن شد، سر از پا نمیشناختم. بعد از آن مساله خواندن مقدار یک بیت بود که با کمی بالا پایین کردن و سعی و خطا بلاخره این مورد هم درست شد.
چالش طراحی سخت افزار مناسب I2C
پازلهای حل معما یکی یکی داشت پشت سر هم ردیف میشد، هر تکه از پازل چالشی درخور داشت که از حل کردن آن لذت میبردم. حالا چالش جدید طراحی سخت افزار مناسب برای برقراری ارتباط با آیسی حافظه بود.
برای کلاک مشکلی وجود نداشت میتوانستم مستقیم آن را به یکی از پایه های LPT وصل کنم و مشکلی پیش نمیآمد. مشکل اصلی برای پایه SDA بود. اگر با پروتکل i2c آشنایی داشته باشید حتما میدانید که این پایه در زمان هایی به شکل ورودی عمل میکند و در زمانهایی به شکل خروجی است
لازم است که در طراحی به شکل اپن درین (open drain) به آن وصل شوید. اما پورت پرینتر چنین امکانی را نداشت که بشود یک پایه را ورودی یا خروجی کرد یا پورت ورودی بود یا خروجی!!! اما راه حل چی بود؟
بعد از چند ساعت فکر کردن راه حل رو پیدا کردم، راه حل با یک مقاومت و یک دیود حاصل شد. مقاومت برای پول آپ کردن پایه و دیود تنها برای صفر کردن پایه به کمک یک پورت خروجی و برای خواندن وضعیت خط sda هم از یک پین ورودی استفاده کردم. یعنی از دوتا پایه برای خواندن و نوشتن یک پایه استفاده کردم که خوب به نظرم راه دیگه ای وجود نداشت.
ولتاژ مورد نباز برای کار کردن آیسی را هم از بقیه io های پورت lpt گرفتم که نیازی به آداپتور مجزا نباشه ?
بلاخره خواندن حافظه آیسی
حالا که بلاخره چالش طراحی سخت افزار حل شده باید برنامه را مینوشتم، یه مقدار پیاده سازی حالتهای start و stop باس سخت بود برام، چون دقیقا از روی شکلهای موجود توی دیتاشیت داشتم برنامه رو مینوشتم، دقیقا از روی سیگنالینگی که برای مثال کشیده بود و چقدر خوشحالم که اشتباهی تو دیتاشیت نبود.
خوشبخاته در پروتکل i2c برای این که ببینی داری درست میری جلو یه تمهیدی اندیشیده شده که اگر آدرس ها درست بود آیسی باید با صفر کردن SDA تایید میکرد که دیتا را گرفته است روی این مساله خیلی حساب کرده بودم.
برنامه را اجرا کردم، نه دقیقا اجرا نکردم دیباگ کردم برای بار اول با هر صفر و یک شدن سیگنال به led هایی که وصل کرده بودم به پایهها نگاه میکردم ببینم درست دارن صفر و یک میشوند ، اول حالت استارت بعد آدرس آیسی و حالا نوبت تایید آدرس بود که بله تایید شد :).
بار اول فکر کردم اتفاقی بوده و بهتره دوباره تست کنم، دو باره تایید رو گرفتم چند بار تست کردم درست کار میکرد ولی باورم نمیشد!!، گفتم بذار آیسی رو در بیارم نباید جواب بگیرم و جواب تایید نیامد.
همه چی درست کار میکرد. واقعا باور نمیکردم و از خوشحالی در خودم نمیگنجیدم.
البته بعد از دریافت اولین ack کمی زمان برد تا برنامه رو کامل کنم و فانکشنهای خواندن و نوشتن و ذخیره و لود در و از فایل رو پیاده سازی کنم،که در مقیاس خودش چالش های جدیی برام داشت. ولی بلاخره تمام شد برنامه کامل شد.
سرانجام هک سخت افزار
برنامه خواندن و نوشتن آماده شده بود و کابل رابط هم درست کرده بودم و وارد فاز جدیدی شدیم که قرار بود نحوه ذخیره سازی و الگوی داده ها را استخراج کنیم و برنامه ای بنویسیم که بدون نیاز به تلویزیون دیگر برای انجام تنظیمات به سادگی مقادیر دلخواه رو ایجاد و ذخیره کنیم.
ایده هم اینطور بود که چیپ رو میخوندیم بعد یه پارامتر رو تغییر میدادیم و بعد دوباره میخواندیم ببینیم چه بایتهایی تغییر میکردند و از چه عددی به چه عددی تغییر کردند با این روش میتوانستیم الگوی ذخیره سازی را در بیاوریم! استخراج یه سری داده ساده بود و همون بار اول اتفاق افتاد ولی برخی داده ها تغییراتون منطقی نبود شاید بیتی بودن نمیدونم ولی هیچ وقت این کار تمام نشد! و اون برنامه نوشته نشده. دقیقا یادم نمیآد چرا ولی تاخیر افتاد و فراموش شد.
البته از برنامه ای که نوشته بودم و سخت افزاری که درست کرده بودم استفاده میشد به این شکل که دوستم کلکسیون از آیسی تلویزیونهای مختلف آماده داشت و فایل هاشون رو ذخیره داشت آیسیها رو پروگرام میکرد و میفروخت!
ما هم هیچ، ما هم نگاه.
در انتهای هک سخت افزار
1) البته ممکنه الان فکر کنید خوب چه کاری بود این کار یه پروگرامر اماده میخریدم دیگه ! باید بگم که قضیه مربوط به بیش از 20 سال پیش است و الکترونیک اون روز ها خیلی با این چیزی که بهش میگیم الکترونیک فرق میکرد و دسترسی برای خرید خارجی مثل الان نبود، و تنها راه منطقی که به نظر می رسید همین کاری بود که انجام دادم.
2) خیلیها فکر میکند برای این که چیزهای جدید یاد بگیرن حتما باید کلاس برن و کلی هزینه کنن ولی باید بگم من اینقدری که از این مدل کرم ریختنها چیزهای جدید و چالشی یاد گرفتم تو هیچ کلاسی چیز یادنگرفتم (البته باید اشاره کنم نامبرده جز کلاس های درسی هیچ کلاس دیگه ای نرفته)
3) قبلا هم گفتم شکستن صورت مساله به بخش های کوچک تر کمک میکنه دید بهتری نسبت به اون مساله داشته باشید و برای ارتقاء یا رفع عیبهای آن راحتتر ایده پردازی کنید.
4) خیلی پیش میآد چیزایی که میسازیم کار نکنن، ساده ترین کار اینه که بذاریمش کنار ولی بهترین کار اینه که از خودمون بپرسیم چرا کار نمیکنه و زوایای منطقی اون رو بررسی کنیم تا ببینیم دقیقا چرا کار نمیکنه شاید نتونیم مشکل رو حل کنیم ولی حداقل خواهیم دانست که چرا کار نمیکنه و این خیلی مهمه.
منبع:سیسوگ