گزارشهای کرنل دقیقا داره چی میگه من سواد خوندنش رو ندارم ولی یک issue توی مخزن باز کردم
https://gitlab.freedesktop.org/xorg/driver/xf86-video-nouveau/-/issues/563
خیلی دوست دارم توی توسعه دادنش مشارکت داشته باشم و میخام یاد بگیرم چطوری کار میکنه. اگر کتاب و سایت یا مرجعی به درد بخور برای کمک به یاد گرفتن توسعه درایور کارت های گرافیکی وجود داره معرفی کنید.
اگه میخواهید توی توسعه nouveau مشارکت داشته باشید، احتمالا باید بلد باشید چجوری برای کرنل ماژول بنویسید و همینطور چجوری کد ماژولهای نوشته شده رو بخونید.
برای اینکار میتونید از راهنمای lkmp (مخفف linux kernel module programming) استفاده کنید.
https://github.com/sysprog21/lkmpgمیتونید به راهنمای متنی اون از طریق اینجا دسترسی داشته باشید:
https://sysprog21.github.io/lkmpgpdf اون رو هم میتونید توی صفحه پروژه توی گیتهاب (که بالاتر لینکش رو گذاشتم) و همینطور لینک بالا پیدا کنید.
برای اینکه بتونید برای کرنل ماژول بنویسید یا کد ماژولهای نوشته شده رو بخونید، لازمه اول به زبان برنامه نویسی c مسلط باشید.
چیزهایی مثل اشارهگر به تابع یا ساختارها (structure) زیاد توی کد کرنل استفاده شدند و برای اینکه بتونید اون کدها رو متوجه بشید یا کدی بنویسید، باید به این چیزها خوب مسلط باشید.
شاید بتونید توی توسعه ابزارها و کتابخانههای سمت فضای کاربر (user space)، مثل drm یا glx یا vulkan یا ... هم مشارکت داشته باشید. البته در این حالت باز هم نیازه خوب به c مسلط باشید.
ولی منظور از firmware همون https://en.wikipedia.org/wiki/Video_BIOS هست ولی این فریمور عمومی هست و فریمور اختصاصی درون باینری درایور انویدیا هست. همینطوره آیا درست گفتم؟
راستش نمیدونم.
فقط میدونم برای استفاده از VDPAU توی گرافیکهای انویدیا، به firmware انحصاری نیاز دارید که میشه اونها رو از درایورهای انحصاری استخراج کرد.
فکر کنم برای انجام این کار از ابزار https://nouveau.freedesktop.org/Valgrind-mmt.html و https://nouveau.freedesktop.org/REnouveau.html استفاده می کنن که من بلد نیستم چطوری کار می کند.
دومی که زیاد استفاده نمیشه و اولی جای اون رو گرفته.
نمیدونم میشه با اینها، اون firmware ها رو استخراج کرد یا نه. فقط میدونم با اسکریپت پایتون extract_firmware py توی این مخزن میشه firmware های مورد نیاز رو از درایورهای انحصاری استخراج کرد.
https://github.com/envytools/firmwareو این قسمت زیر از مقاله https://en.wikipedia.org/wiki/VESA_BIOS_Extensions هست دقیقا متوجه نشدم مخصوصا https://en.wikipedia.org/wiki/Thunk رو
Despite this, it is common that a driver thunk out to the real mode interrupt in order to initialize screen modes and gain direct access to a card's linear frame buffer, because these tasks would otherwise require handling many hundreds of proprietary variations that exist from card to card.
منم درست نفهمیدم.
ببینید آیا https://developer.nvidia.com/nvidia-video-codec-sdk/download به درد میخوره
نمیدونم به درد این موضوع میخوره یا نه. ولی از اونجایی که گفته باید درایورهای سری 470 یا جدیدتر داشته باشید، فکر نکنم بدرد بخوره.
بعد از اینکه firmware ها رو استخراج میکنید، لازمه اونها رو کپی کنید داخل /lib/firmware/nouveau/
اون فایلهایی که کپی میشن خارج از کنترل مدیربسته هستند. تا جایی که میدونم، یه فایل deb نه توی مخازن و نه جای دیگه وجود داره که اون رو نصب کنید تا مدیربسته اون firmware ها رو مدیریت کنه.
ولی از اونجایی که این فایلها فقط یه سری firmware هستند و معمولا زیاد تغییر نمیکنند و کار خاصی هم لازم نیست قبل یا بعد از کپی کردن اونها انجام بدید، فکر نکنم کپی کردن اون فایلها توی اون مسیر، مشکلی بوجود بیاره. ولی همچنان یه احتمال کوچک هست که مشکل ایجاد بشه.
برای اینکه firmware های مورد نیاز رو بدست بیارید، اول یه دایرکتوری ایجاد کنید که موقتی فایلها داخل اون قرار بگیرن و بعد واردش بشید.
mkdir ~/extract-firmware
cd ~/extract-firmware
اگه میخواهید، میتونید اسم یا مسیر دایرکتوری رو عوض کنید.
الان اون اسکریپت پایتون رو از گیتهاب بگیرید.
wget https://raw.github.com/envytools/firmware/master/extract_firmware.py
اگه میخواهید، میشه از یه ابزار دیگه برای دانلود استفاده کرد. برای مثال curl یا aria2 یا wget2 یا ...
الان درایورهای انحصاری انویدیا نسخه 340.108 رو دانلود کنید.
wget http://us.download.nvidia.com/XFree86/Linux-x86/340.108/NVIDIA-Linux-x86-340.108.run
مثل بالا، اگه بخواهید، میتونید از یه ابزار دیگه برای دانلود استفاده کنید.
میتونید firmware ها رو از نسخههای دیگه درایورهای انحصاری انویدیا هم استخراج کنید. برای اینکه ببینید اسکریپت extract_firmware.py از کدومها پشتیبانی میکنه، کدهای extract_firmware.py رو ببینید.
فایلهای خود درایور انحصاری رو از فایل run. دانلود شده استخراج کنید
bash NVIDIA-Linux-x86-340.108.run --extract-only
الان با استفاده از اون اسکریپت پایتون، firmware های انحصاری رو استخراج کنید.
python3 ./extract_firmware.py
قبلا این اسکریپت با پایتون ۳ سازگار نبود و برای اجرای اون، به پایتون ۲ نیاز داشتید. ولی یه مدتیه که این اسکریپت طوری نوشته شده که هم با پایتون ۳ کار بده و هم پایتون ۲.
میتونید به جای اینکه به python3 بگید اون اسکریپت رو اجرا کنه، اول دسترسی اجرایی به اسکریپت بدید و بعد مستقیم اجراش کنید.
البته این اسکریپت سعی میکنه با usr/bin/python/ اجرا بشه. این مسیر، مربوط به فایل اجرایی پایتون ۲ هست و به همین خاطر احتمالا با دادن دسترسی اجرایی به اسکریپت و اجرا مستقیم اون، یه خطا میگیرید که interupter این فایل وجود نداره.
برای حل این مشکل میتونید:
۱- اسکریپت رو باز کنید و این خط رو که خط اول هست:
#!/usr/bin/python
به این تغییر بدید:
#!/usr/bin/python3
۲- اگه روی دبیان یا اوبونتو یا یه توزیع مبتنی بر اونها هستید، میتونید بسته python-is-python3 رو نصب کنید تا لینکهای مناسب ایجاد بشن و با اجرای usr/bin/python/ پایتون ۳ اجرا بشه.
۳- میتونید پایتون ۲ رو نصب کنید. البته اینکار پیشنهاد نمیشه چون مدت زیادیه که پشتیبانی از پایتون ۲ تموم شده. (ولی همچنان توی مخازن دبیان هست چون هنوز برنامههایی هستند که فقط با پایتون ۲ اجرا میشن.)
بعد از اینکه اون اسکریپت پایتون رو اجرا کردید و firmware ها استخراج شدند، باید اونها رو توی جای مناسب قرار بدید تا استفاده بشن.
اول دایرکتوری /lib/firmware/nouveau/ رو با دسترسی، گروه و مالکیت درست بسازید.
sudo mkdir -m 0755 /lib/firmware/nouveau
sudo chown root:root /lib/firmware/nouveau
الان firmware های استخراج شده رو کپی کنید توی جای مناسب.
برای اینکار از دستور cp استفاده کنید و بعد chown و chmod رو اجرا کنید تا از دسترسی و گروه اون فایلها مطمئن بشید.
sudo cp -d ./nv* ./vuc-* /lib/firmware/nouveau
sudo chown root:root /lib/firmware/nouveau/*
sudo chmod 0644 /lib/firmware/nouveau/*
احتمالا به بیشتر اون firmware های استخراج شده نیاز ندارید و فقط بعضی از اونها مورد نیاز هستند؛ ولی از اونجایی که دقیق نمیدونید کدومها مورد نیاز هستند، باید همه رو کپی کنید.
بودن firmware هایی که لازم ندارید، توی این شرایط مشکلی ایجاد نمیکنه.
بعد سیستم رو راهاندازی مجدد کنید و ببینید همچنان سیستم به طور ناگهانی فریز میشه یا نه.