ডিভাইসে ইউএসবি ড্রাইভার কীভাবে নির্ধারণ করবেন


30

এই প্রশ্নটি দ্বিগুণ:

প্রথমত, আপনি কীভাবে একটি ইউএসবি ডিভাইস থেকে চালককে ম্যানুয়ালি বিচ্ছিন্ন করে এবং একটি আলাদা সংযুক্ত করেন? উদাহরণস্বরূপ, আমার একটি ডিভাইস রয়েছে যা সংযুক্ত হয়ে গেলে স্বয়ংক্রিয়ভাবে ইউএসবি-স্টোরেজ ড্রাইভারটি ব্যবহার করে।

ইউএসভিউ আউটপুট

Vendor Id: xxxx
Product Id: xxxx
...
    Number of Interfaces: 2
    Interface Number: 0
        Name: usb-storage
        Number of Endpoints: 2
        ...
    Interface Number: 1
        Name: (none)
        Number of Endpoints: 2
        ...

আমি ইউএসবি-স্টোরেজ ড্রাইভারটি ব্যবহার করতে চাই না, তাই আমার অ্যাপ্লিকেশনটিতে আমি libusbইউএসবি-স্টোরেজ ড্রাইভারকে আলাদা করতে লাইব্রেরিটি ব্যবহার করি এবং তারপরে আমি ইন্টারফেসটি দাবি করি। আমি তখন আমার ইউএসবি ডিভাইসে এবং আমার হোস্ট লিনাক্স সিস্টেমে চলমান অ্যাপ্লিকেশনগুলিতে এবং এর মাধ্যমে ডেটা প্রেরণ করতে পারি।

আপনি কোনও অ্যাপ্লিকেশনের বাইরে চালককে কীভাবে আলাদা করতে পারেন?


দ্বিতীয়ত, আমি কীভাবে স্বয়ংক্রিয়ভাবে ড্রাইভারকে ডিভাইস প্লাগইনে সংযুক্ত করার জন্য বরাদ্দ করব? ডিভাইসের অনুমতিগুলি স্বয়ংক্রিয়ভাবে সেট করার জন্য আমার কাছে বর্তমানে একটি উদেব নিয়ম সেটআপ রয়েছে:

SUBSYSTEM=="usb", ATTR{idVendor}=="xxxx", MODE="0666"

ইউএসবি ডিভাইসে নির্দিষ্ট ইন্টারফেসগুলিতে ড্রাইভার নিয়োগের জন্য আমি কী ইউদেব বিধিগুলি ব্যবহার করতে পারি? উদাহরণস্বরূপ, আমি যদি ইউএসবি-স্টোরেজের পরিবর্তে ইউএসবিএন মডিউলটি ইন্টারফেস 0-এ স্বয়ংক্রিয়ভাবে ব্যবহার করা চাই, তবে তা কি উদেব সম্ভব?



1
আপনার কি সমস্ত ইউএসবি-স্টোরেজ মডিউল দরকার? কারণ যদি না হয় তবে আপনি এটি একটি কালো তালিকাতে রাখতে পারেন এবং এটি মোটেই লোড হবে না।
হানান এন।

@ গিলস, আমি সফলভাবে এলকেএম লোড করতে সক্ষম হয়েছি। আমার প্রশ্ন হ'ল আমি কীভাবে ম্যানুয়ালি এবং স্বয়ংক্রিয়ভাবে এটি ডিভাইসের সাথে সংযুক্ত করব?
লিনসেক

@ হানান, বর্তমানে ইউএসবি-স্টোরেজ মডিউলটির জন্য আমার কোনও ব্যবহার নেই। সঠিক মডিউলটি স্বয়ংক্রিয়ভাবে সংযুক্ত করার জন্য আমার এটি কালো তালিকাভুক্ত করার প্রয়োজন হতে পারে তবে প্রথমে আমাকে ইউএসবিএনটি কীভাবে সংযুক্ত করতে হবে তা জানতে হবে।
লিন্সেক

1
@ এনজোজভিয়াক মডিউলটি usbnetস্বয়ংক্রিয়ভাবে লোড হবে না, কারণ এটিতে হার্ডওয়্যার সম্পর্কিত কোনও তথ্য নেই, যা এটি ব্যবহার করতে পারে। সঠিক ড্রাইভার এবং ব্যবহার করার চেষ্টা করুন, উদাহরণস্বরূপ modinfo kalmia,। ইন aliasলাইন হিসাবে আপনি বিক্রেতার আইডি হাতের এবং পণ্য আইডি YYYY দেখতে হবে usb:vxxxxpyyyy। অথবা আপনি ফাইলটি /lib/modules/kernel_version/modules.usbmap সম্পাদনা করতে পারেন এবং আপনার এইচডাব্লু এর জন্য আপনি লাইনটি মুছতে পারেন, যেখানে আপনার জন্য এইচডাব্লিউ মডিউল ইউএসবি-সঞ্চয়স্থান রয়েছে বা সঠিক নেট ড্রাইভারের সাহায্যে ইউএসবিস্টোরেজ পরিবর্তন করতে পারেন। তবে depmod -aএই পরিবর্তনটি চলে যাবে ...
জান মারেক

উত্তর:


20

প্রশ্নের প্রথম অংশের জন্য, আপনি ইতিমধ্যে লাইবাসব দিয়ে যা করছেন তার চেয়ে বেশি ইউএসবি ড্রাইভারকে আলাদা করার জন্য আমি আরও ভাল উপায় খুঁজছি এবং খুঁজে পাচ্ছি না।

প্রশ্নের দ্বিতীয় অংশ হিসাবে, উদেব ড্রাইভার লোডিংয়ের ক্ষেত্রে প্রতিক্রিয়া জানাতে পারে, তবে কোনও নির্দিষ্ট ড্রাইভারকে কোনও ডিভাইসে বরাদ্দ করতে বাধ্য করে না ।

লিনাক্স কার্নেলের প্রতিটি ড্রাইভারই এক বা একাধিক ডিভাইসের জন্য দায়বদ্ধ। ড্রাইভার নিজেই এটি ডিভাইসগুলি সমর্থন করে তা চয়ন করে। এটি প্রোগ্রামিকভাবে এটি করে, যেমন ডিভাইসের বিক্রেতা এবং পণ্য আইডি পরীক্ষা করে বা যদি সেগুলি উপলব্ধ না হয় (যেমন কোনও পুরানো ডিভাইস), কিছু স্বতঃ-সনাক্তকরণের হিউরিস্টিকস এবং স্যানিটি পরীক্ষা করে। একবার চালক যখন আত্মবিশ্বাস পান যে কোনও ডিভাইস এটি সমর্থন করে তবে এটি তার সাথে যুক্ত হয়। সংক্ষেপে, আপনি প্রায়শই কোনও নির্দিষ্ট ড্রাইভারকে একটি নির্দিষ্ট ডিভাইস ব্যবহার করতে বাধ্য করতে পারবেন না। কখনও কখনও, তবে কোনও ডিভাইস ড্রাইভার তার গ্রহণযোগ্যতার সাথে উদার হয় এবং কোনও ডিভাইস এমন কাজ করতে পারে যা এটি সম্পর্কে জানা থাকে না। আপনার মাইলেজ আলাদা হবে! অতীতে, আমি মেশিনে অদ্ভুত পিসিআই ডিভাইস / বিক্রেতা আইডি চালকদের সাথে যুক্ত করতে হয়েছিল যা তাদের সমর্থন করা উচিত, মিশ্র সাফল্য এবং কয়েকটি মজাদার কর্নেল ক্রাশ সহ।

মডিউলগুলির ক্ষেত্রে এখন একটি অতিরিক্ত পদক্ষেপ রয়েছে। মডিউল লোডার কার্নেল দ্বারা আপ woken যখন একটি নতুন ডিভাইস সনাক্ত করা হয়। এটি একটি 'মোডালিয়াস' স্ট্রিংটি পেরিয়ে গেছে যা ডিভাইসটি সনাক্ত করে এবং ইউএসবি ডিভাইসের জন্য এরকম কিছু দেখায়:

usb:v046DpC221d0170dc00dsc00dp00ic03isc00ip00

এই স্ট্রিংটিতে ডিভাইস শ্রেণি ( usb) এবং শ্রেণি-নির্দিষ্ট তথ্য (বিক্রেতা / ডিভাইস / সিরিয়াল নম্বর, ডিভাইস শ্রেণি, ইত্যাদি) রয়েছে। প্রতিটি কার্নেল ড্রাইভারের মধ্যে একটি লাইন থাকে:

MODULE_ALIAS("usb:...")

যা অবশ্যই ইউএসবালিয়াসের সাথে মিলবে (একাধিক ডিভাইসের সাথে মিলের জন্য ওয়াইল্ডকার্ডগুলি ব্যবহৃত হয়)। যদি modaliasড্রাইভারটি সমর্থন করে এমন একটির সাথে মেলে, এই ড্রাইভারটি লোড করা হয়েছে (বা নতুন ডিভাইসটি সম্পর্কে অবহিত রয়েছে, যদি তা ইতিমধ্যে সেখানে থাকে)।

আপনি সমর্থিত ডিভাইসগুলি (মোডালিয়াস দ্বারা) এবং এর সাথে সম্পর্কিত মডিউলগুলি দেখতে পারেন

less /lib/modules/`uname -r`/modules.alias

আপনি যদি ইউএসবি-স্টোরেজ ডিভাইস ড্রাইভারের জন্য গ্রেপ করেন, আপনি দেখতে পাবেন এটিতে কিছু নির্দিষ্ট ডিভাইস রয়েছে যা এটি বিক্রেতা এবং ডিভাইস আইডি দ্বারা সমর্থন করে এবং ঠিক কোনও (ডিভাইস স্টোরেজ) শ্রেণি সহ যেকোন ডিভাইসকে সমর্থন করার চেষ্টা করবে, এটি বিক্রেতার / ডিভাইসের কোনও বিষয় নয় matter ।

আপনি এটি আপনার ওএসে ( /etc/modprobe.d/ডেবিয়ান এবং বন্ধুদের উপর) ইউজারস্পেস মেকানিজম ব্যবহার করে প্রভাবিত করতে পারেন । আপনি মডিউলগুলি কালো তালিকাভুক্ত করতে পারেন, বা আপনি মডেলিয়ায় লোড করার জন্য মডিউলগুলি modules.aliasফাইলের মতো (এবং একই সিনট্যাক্স ব্যবহার করে) নির্দিষ্ট করতে পারেন । depmod -aএরপরে মডিউল লোডারের নিদর্শনগুলি পুনরায় তৈরি করবে।

তবে, আপনি যদি এই নির্দিষ্ট ঘোড়াটিকে জলে নিয়ে যেতে পারেন তবে আপনি তাকে পান করতে পারবেন না। ড্রাইভারটির যদি আপনার ডিভাইসের কোনও সমর্থন না থাকে তবে এটি এড়ানো উচিত।

এটি সাধারণ ক্ষেত্রে তত্ত্ব।

অনুশীলনে, এবং ইউএসবি-র ক্ষেত্রে, আমি দেখতে পাচ্ছি যে আপনার ডিভাইসে দুটি ইন্টারফেস রয়েছে , যার মধ্যে স্টোরেজটি একটি। কার্নেল সামগ্রিক ডিভাইসের স্টোরেজ ইন্টারফেসের সাথে সংযুক্ত করবে । অন্যান্য ইন্টারফেস অধিকার বর্গ থাকে, তাহলে usbnetচালক পারে এটি সংযুক্ত করুন। হ্যাঁ, আপনি একই শারীরিক ডিভাইসে একাধিক ড্রাইভার সংযুক্ত থাকতে পারেন , কারণ একটি ইউএসবি ডিভাইস একাধিক ইন্টারফেস রফতানি করে (যেমন আমার লজিটেক জি 15 কীবোর্ড দুটি রফতানি করে কারণ এতে একটি কীবোর্ড ডিভাইস এবং একটি এলসিডি স্ক্রিন রয়েছে, যার প্রত্যেকটি পৃথক ড্রাইভার দ্বারা পরিচালিত হয়) ।

আপনার ইউএসবি ডিভাইসের দ্বিতীয় ইন্টারফেসটি সনাক্ত করা যায়নি এটি কার্নেলের সমর্থনের অভাবের ইঙ্গিত দেয়। যাই হোক না কেন, আপনি ডিভাইস ইন্টারফেসগুলি / শেষ পয়েন্টগুলি উদ্দীপনাজনক বিশদ ব্যবহার করে তালিকাভুক্ত করতে পারেন lsusb -v | less, তারপরে আপনার নির্দিষ্ট ডিভাইসে স্ক্রোল করুন (আপনি যদি ডিভাইস দ্বারা আউটপুট সীমাবদ্ধ করতে পারেন: বিক্রেতার আইডি বা ইউএসবি পাথ যদি আপনি খুব ঝোঁক থাকেন)।

দয়া করে নোট করুন: আমি ইউএসবি ডিভাইসের যৌক্তিক কাঠামোর ক্ষেত্রে এখানে কিছুটা ওভারস্পিম্প্লিফাই করছি। ইউএসবি কনসোর্টিয়ামকে দোষ দিন। :)


4
static struct usb_device_id id_table [] = { { USB_DEVICE(VENDOR_ID, PRODUCT_ID) }, { }, }; MODULE_DEVICE_TABLE (usb, id_table);কোডটিতে ইতিমধ্যে রয়েছে, এটি কি মডেলিয়াসের সাথে নিরর্থক?
টমাস

আমার ক্ষেত্রে সেই লাইনগুলি ড্রাইভারের মধ্যে যে কোনও জায়গায় কোনও মেকফিল যাদু দ্বারা স্বয়ংক্রিয়ভাবে তৈরি হয়। এজন্য আমি MODULE_ALIAS এর জন্য তিনবার লাইন যুক্ত করেছি তবে এটি কখনই তালিকাভুক্ত হয় না। যাইহোক lsusb -v জন্য ধন্যবাদ। এটির সাহায্যে আমি এটি যাচাই করতে পারি এবং আমার ধারণার ত্রুটি খুঁজে পেতে পারি। আমি তখন পরিচিত শনাক্তকারীর জন্য উত্সটি গ্রেপ করেছিলাম এবং আমাকে যে হস্তক্ষেপ করতে হয়েছিল সেগুলি সহ অ্যারেটি খুঁজে পেয়েছি।
জ্যাকগ্রিনিংট্যাগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.