『壹』 USB JOYSTICK 驅動 WIN7 家庭版 32
1.需要該手柄硬仿敬件的驅動,就是一張光碟進行手柄的驅動安裝。又有安裝的驅動才能讓手柄在電腦上正常的運行。如果一些手柄帶有內置驅動 就不需要那麼麻煩了。直接插上就會提示你安裝使用的。
2 手柄必須支持你所玩的游戲。
3 window7 的系統很有可能跟你的手柄硬體不兼容塵鬧造成無法使用。
你在朋友或者親戚家使用XP系統試試是否是系備兄慎統不兼容的問題。
『貳』 USB Joystick是黃色問號,手柄驅動裝不起,不能識別硬體
還是驅動的問題,可能之前的驅動沒有卸載干凈,很有可能是有些注冊碼殘留,用優化大師清理一下,或者360磁碟清理,重新安裝,重啟,中租清試試賣前看。還型橡有就是USB口肯能算壞,(可能與主板連接松動)導致供電不足(很少出現)。
『叄』 急。關於游戲手柄的驅動問題
他寫的是「添加其他設備」,如果要安裝的話一般默認的SNOY的手柄就應該可以。
『肆』 linux修改手柄默認名稱
linux修改手柄默認名稱是掘宏肢臘hostname,此命令的作用是暫時修改linux的主機設備名稱,它的存活時間為linux當前的運行時間,即在重啟linux之前的運行時間內。一般修改以後就生效,但是不能夠永判飢冊久修改。PS2模擬器是一款免費、並且源代碼開放的軟體,發布於在GNU通用公共許可證下,是一款PlayStation 2模擬器軟體。PS2模擬器是世上第一個成功模擬PS2商業游戲的PCSX2模擬器。PS2模擬器下載使用C語言編寫,可以在32位微軟Windows和Linux操作系統下使用。
『伍』 ubuntu怎麼用接收器連接手柄
在ubuntu1604/2004環境下實現xbox one無線手柄遙+usb無線適配器控機器人運動。
1. 安裝xboxdrv和joystick
sudo apt install xboxdrv
sudo apt install joystick
2. 將usb無線接收器插入,查看設備信息
cat /proc/bus/input/devices
輸出如下信息說明枝運系統已經識別到了xbox的接收器
I: Bus=0003 Vendor=045e Proct=0719 Version=0100
N: Name="Xbox 360 Wireless Receiver"
P: Phys=
S: Sysfs=/devices/virtual/input/input28
U: Uniq=
H: Handlers=event28 js3
B: PROP=0
B: EV=b
B: KEY=f 0 0 0 0 0 0 7fdb000000000000 0 0 0 0
B: ABS=1b
登錄後復制
3. 編譯xow
Xow是一個非官方的Linux版本Xbox one手柄無線適配器驅動,其底層基於libusb進行工作,通過wifi與游戲手柄進行連接,其使用MT76xx的Wifi chip;
3.1 下載xow源碼
git clonet https://github.com/mesalix/xow.git
3.2 安裝依賴
audo apt install curl libusb-1.0-0-dev cabextract
3.3 編譯
cd xow
make BUILD=RELEASE
sudo make install
3.4 Download the firmware for the wireless dongle:
sudo xow-get-firmware.sh
3.5 運行xow
sudo ./xow
[sudo] password for sar:
2022-05-20 11:18:43 INFO - xow v0.5-36-gd335d60 ©Severin v. W.
2022-05-20 11:18:43 INFO - Waiting for device…
2022-05-20 11:18:43 INFO - Wireless address: 62:45:bd:05:8b:85
2022-05-20 11:18:43 INFO - Dongle initialized
2022-05-20 11:18:49 INFO - Controller 『1』 connected
2022-05-20 11:18:49 INFO - Device announced, proct id: 02d1
2022-05-20 11:18:49 INFO - Battery level: full
2022-05-20 11:28:10 INFO - Controller 『1』 disconnected
2022-05-20 11:33:12 INFO - Controller 『1』 connected
2022-05-20 11:33:12 INFO - Device announced, proct id: 02d1
3.6 編譯錯誤解決:
執行make BUILD=RELEASE報錯:找不到uinput_setup、uinput_abs_setup的定義
報錯原因:linux內核版本太低,xow不支持UINPUT_VERSION 5以下版本;
解決方法:從高版本的ubuntu中拷貝/usr/include/linux/uinput.h替換當前系統下的/usr/include/linux/uinput.h
xow驅動分析可以參考這篇博客:https://blog.csdn.net/YingbinLi/article/details/123268015
4. xbox手柄測試
先運行./xow,在按下xbox one手柄最前端的旦冊帶x標識的圓形按鍵,按下按鍵後按鍵燈點亮,開始慢閃,配對模搭宏成功後,按鍵燈常亮;
打開了一個linux終端,運行:
sudo jstest /dev/input/js4
Driver version is 2.1.0.
Joystick (Xbox One Wireless Controller) has 8 axes (X, Y, Z, Rx, Ry, Rz, Hat0X, Hat0Y)
and 11 buttons (BtnA, BtnB, BtnX, BtnY, BtnTL, BtnTR, BtnSelect, BtnStart, BtnMode, BtnThumbL, BtnThumbR).
Testing ... (interrupt to exit)
Axes: 0: 0 1: 0 2:-32767 3: 0 4: 0 5:-32767 6: 0 7: 0 Buttons: 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 10:off
登錄後復制
注意:在/dev/input下可能會生成js0, js1, js2, js3, js4 5個文件,可以分別使用jstest 測試一下,運行sudo jstest /dev/input/js4 後,操作手柄操作桿查看數據是否有變化。
5. xbox手柄操作數據接收與解析
joystick_xbox.h
#include <linux/input.h>
#include <linux/joystick.h>
#include <string>
class JoystickXBox
{
public:
JoystickXBox(const std::string &dev_name);
~JoystickXBox();
bool Open();
void Close();
bool Read(struct js_event &js);
unsigned char GetAxes()
{
return axes_;
}
unsigned char GetButtons()
{
return buttons_;
}
int GetFd()
{
return fd_;
}
void PrintData();
void ProcessData(const struct js_event &js);
private:
bool debug_ = false;
int fd_ = -1;
std::string dev_name_ = "";
int version_ = 0x000800;
char name_[512] = "Unkown";
unsigned char axes_ = 2;
unsigned char buttons_ = 2;
int *axis_ = nullptr;
char *button_ = nullptr;
};
登錄後復制
joystick_xbox.cpp
#include <errno.h>
#include <fcntl.h>
#include <memory>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include "joystick_xbox.h"
JoystickXBox::JoystickXBox(const std::string &dev_name) : fd_(-1),dev_name_(dev_name)
{
}
JoystickXBox::~JoystickXBox()
{
if (axis_)
{
delete axis_;
axis_ = nullptr;
}
if (button_)
{
delete button_;
button_ = nullptr;
}
}
bool JoystickXBox::Open()
{
int fd = -1;
if (dev_name_.length() == 0)
{
return false;
}
// O_NONBLOCK open
fd = open(dev_name_.c_str(), O_RDONLY | O_NONBLOCK);
if (fd < 0)
{
fd_ = -1;
printf("JoystickXBox open %s error, %d(%s)\n", dev_name_.c_str(), errno, strerror(errno));
return false;
}
ioctl(fd, JSIOCGVERSION, &version_);
ioctl(fd, JSIOCGAXES, &axes_);
ioctl(fd, JSIOCGBUTTONS, &buttons_);
ioctl(fd, JSIOCGNAME(512), name_);
printf("JoystickXBox Driver version is %d.%d.%d.\n", version_ >> 16, (version_ >> 8) & 0xff, version_ & 0xff);
printf("JoystickXBox (%s) has %d axes and %d buttons\n", name_, axes_, buttons_);
fd_ = fd;
axis_ = (int *)calloc(axes_, sizeof(int));
button_ = (char *)calloc(buttons_, sizeof(char));
return true;
}
void JoystickXBox::Close()
{
if (fd_ > 0)
{
close(fd_);
fd_ = -1;
}
}
bool JoystickXBox::Read(struct js_event &js)
{
int len = -1;
if (fd_ < 0)
{
return false;
}
memset(&js, 0, sizeof(js));
len = read(fd_, &js, sizeof(struct js_event));
if (len != sizeof(struct js_event))
{
printf("JoystickXBox: error reading, %d(%s)\n", errno, strerror(errno));
return false;
}
return true;
}
void JoystickXBox::ProcessData(const struct js_event &js)
{
JoystickFrame frame;
int joystick_angular_value = 0;
int joystick_linear_value = 0;
int button_angular_value = 0;
int button_linear_value = 0;
switch (js.type & ~JS_EVENT_INIT)
{
case JS_EVENT_BUTTON:
button_[js.number] = js.value;
break;
case JS_EVENT_AXIS:
axis_[js.number] = js.value;
break;
}
if (debug_)
{
PrintData();
}
}
void JoystickXBox::PrintData()
{
if (axes_ && axis_)
{
printf("Axes: ");
for (int i = 0; i < axes_; i++)
{
printf("%2d:%6d ", i, axis_[i]);
}
}
if (buttons_ && button_)
{
printf("Buttons: ");
for (int i = 0; i < buttons_; i++)
{
printf("%2d:%s ", i, button_[i] ? "on " : "off");
}
}
printf("\n");
fflush(stdout);
}
int main()
{
bool ret = false;
int err_cnt = 0;
fd_set rfds;
timeval timeout;
struct js_event js;
int fd = -1;
std::string dev_name = "/dev/input/js4";
std::unique_ptr<JoystickXBox> joystick_xbox = std::make_unique<JoystickXBox>(dev_name);
ret = joystick_xbox->Open();
if (!ret)
{
return -1;
}
fd = joystick_xbox->GetFd();
while (1)
{
usleep(100);
timeout.tv_sec = 1;
timeout.tv_usec = 0;
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
int ret = select(fd + 1, &rfds, NULL, NULL, &timeout);
if (ret > 0 && FD_ISSET(fd, &rfds))
{
ret = joystick_xbox->Read(js);
if (ret)
{
joystick_xbox->ProcessData(js);
}
}
}
joystick_xbox->Close();
return 0;
}
登錄後復制
ubuntu
linux
點贊文章給優秀博主打call~
『陸』 求generic USB Joystick驅動``
http://d82.d.iask.com/fs/800/1//exe/Setup.exe
綠1 紅2 藍3 粉4
WELCOM 上面有圈黑色花紋
是盯冊弊這樣的凱族話就用這個了姿慎.
『柒』 FIGHT JOYSTICK搖桿驅動
其實用不著人工搜索這么麻煩,建議你用新版的」驅動精靈「幫你找,安做慶裝運行後它能在網上搜羅關於你電腦上所有硬體所匹配的所有驅動程序(包括最新的和最舊的)爛盯,你要做的就是一般都是選擇最新的那個安裝。
給你個華軍軟體的下飢胡和載地址吧:http://www.onlinedown.net/SOFT/3450.htm
『捌』 如何寫一個Android USB介面驅動
說到 android 驅動是離不開 Linux 驅動的。Android 內核採用的是 Linux2.6 內核 (最近Linux 3.3 已經包含了一些 Android 代碼)。但 Android 並沒有完全照搬 Linux 系統內核,除了對Linux 進行部分修正,還增加了不少內容。android 驅動 主要分兩種類型:Android 專用驅動 和 Android 使用的設備驅動(linux)。
Android 專有驅動程序:
1)Android Ashmem 匿名共享內存; 為用戶空間程序提供分配內存的機制,為進程間提供大塊共享內存,同時為內核提供回收和管理這個內存。
2)Android Logger 輕量級的LOG(日誌) 驅動;
3)Android Binder 基於 OpenBinder 框架的一個驅動;
4)Android Power Management 電源管理模塊;
5)Low Memory Killer 低內存管理器;
6)Android PMEM 物理內存驅動;
7)USB Gadget USB 驅動(基於 gaeget 框架);
8)Ram Console 用於調試寫入日誌信息的設備;
9)Time Device 定時控制設備;
10)Android Alarm 硬體時鍾;
Android 上的設備驅動:
1)Framebuff 顯示驅動;
2)Event 輸入設備驅動;
3)ALSA 音頻驅動;
4)OSS 音頻驅動;
5)v412攝像頭:視頻驅動;
6)MTD 驅動;
7)藍牙驅動;
8)WLAN 設備驅動;
Android 專有驅動程序
1.Android Ashmem
為用戶空間程序提供分配內存的機制,為進程間提供大塊共享內存,同時為內核提供回收和管理這個內存。
設備節點:/dev/ashmen .主設備號 10.
源碼位置: include/linux/ashmen.h Kernel /mm/ashmen.c
相比於 malloc 和 anonymous/named mmap 等傳統的內存分配機制,其優勢是通過內核驅動提供了輔助內核的內存回收演算法機制(pin/unoin)
2.Android Logger
無論是底層的源代碼還上層的應用,我們都可以使用 logger 這個日誌設備看、來進行調試。
設備節點: /dev/log/main /dev/log/event /dev/log/radio
源碼位置:include/linux/logger.h include/linux/logger.c
3.Android Binder
IPC Binder 一種進程間通信機制。他的進程能夠為其它進程提供服務 ----- 通過標準的 Linux 系統調用 API。
設備節點 :/dev/binder
源碼位置:Kernel/include/linux/binder.h Kernel/drivers/misc/binder.c
4.Android Power Management
一個基於標准 linux 電源管理的輕量級 Android 電源管理系統,在 drivers/android/power.c kernel/power/
5.Low Memory Killer
它在用戶空間中指定了一組內存臨界值,當其中某個值與進程描述中的 oom_adj 值在同一范圍時,該進程將被Kill掉(在parameters/adj中指定oome_adj 的最小值)。它與標準的Linux OOM機制類似,只是實現方法不同
源碼位置:drivers/misc/lowmemorykiller.c
6.Android PMEM
PMEM 主要作用就是向用戶空間提供連續的物理內存區域。
1.讓 GPU 或 VPU 緩沖區共享 CPU 核心。
2.用於 Android service 堆。
源碼位置:include/linux/android_pmem.h drivers/android/pmem.c
7.USB Gadget
基於標准 Linux USB gaeget 驅動框架的設備驅動。
源碼位置:drivers/usb/gadet/
8.Ram Console
為了提供調試功能,android 允許將調試日誌信息寫入這個設備,它是基於 RAM 的 buffer.
源碼位置: drivers/staging/android/ram_console.c
9.Time Device
定時控制,提供了對設備進行定時控制的功能。
源碼位置:drivers/staging/android/timed_output.c(timed_gpio.c)
10.Android Alarm
提供一個定時器,用於把設備從睡眠狀態喚醒,同時它還提供了一個即使在設備睡眠時也會運行的時鍾基準。
設備節點:/dev/alarm
源碼位置:drivers/trc/alarm.c
Android 設備驅動
1. Framebuffer 幀緩存設備
Framebuffer 驅動在 Linux 中是標準的顯示設備的驅動。對於 PC 系統,它是顯卡的驅動 ; 對於嵌入式 SOC 處理器系統,它是 LCD 控制器或者其他顯示控制器的驅動。它是一個字元設備,在文件系統中設備節點通常是 /dev/fbx 。 每個系統可以有多個顯示設備 , 依次用 /dev/fbO 、 /dev/fb l
等來表示。在 Android 系統中主設備號為 29 ,次設備號遞增生成。
Android 對 Framebuffer 驅動的使用方式是標準的 , 在 / dev / graphie / 中的 Framebuffer 設備節點由 init 進程自動創建 , 被 libui 庫調用 。 Android 的 GUI 系統中 , 通過調用 Framebuffer 驅動的標准介面,實現顯示設備的抽象。
Framebuff的結構框架和實現 :
linux LCD驅動(二)--FrameBuffer
Linux LCD驅動(四)--驅動的實現
2.Event輸入設備驅動
Input 驅動程序是 Linux 輸入設備的驅動程序 , 分為游戲桿 (joystick) 、 滑鼠 (mouse 和 mice)和事件設備 (Event queue)3 種驅動程序。其中事件驅動程序是目前通用的程序,可支持鍵盤 、 滑鼠、觸摸屏等多種輸入設備。 Input 驅動程序的主設備號是 l3 ,每一種 Input 設備從設備號占 用5 位 , 3 種從設備號分配是 : 游戲桿 0 ~ 61 ; Mouse 滑鼠 33 ~ 62 ; Mice 滑鼠 63 ; 事件設備 64 ~ 95 ,各個具體的設備在 misc 、 touchscreen 、 keyboard 等目錄中。
Event 設備在用戶空問使用 read 、 ioctl 、 poll 等文件系統的介面操作, read 用於讀取輸入信息, ioctl 用於獲取和設置信息, poll 用於用戶空間的阻塞,當內核有按鍵等中斷時,通過在中斷中喚醒內核的 poll 實現。
Event 輸入驅動的架構和實現:
Linux設備驅動之——input子系統
3.ALSA音頻驅動
高級 Linux 聲音體系 ALSA(Advanced Linux Sound Architecture ) 是為音頻系統提供驅動 的Linux 內核組件,以替代原先的開發聲音系統 OSS 。它是一個完全開放源代碼的音頻驅動程序集 ,除了像 OSS 那樣提供一組內核驅動程序模塊之外 , ALSA 還專門為簡化應用程序的編寫提供相應的函數庫,與 OSS 提供的基於 ioctl 等原始編程介面相比, ALSA 函數庫使用起來要更加方便一些
利用該函數庫,開發人員可以方便、快捷地開發出自己的應用程序,細節則留給函數庫進行內部處理 。 所以雖然 ALSA 也提供了類似於 OSS 的系統介面 , 但建議應用程序開發者使用音頻函數庫,而不是直接調用驅動函數。
ALSA 驅動的主設備號為 116 ,次設備號由各個設備單獨定義,主要的設備節點如下:
/ dev / snd / contmlCX —— 主控制 ;
/ dev / snd / pcmXXXc —— PCM 數據通道 ;
/ dev / snd / seq —— 順序器;
/ dev / snd / timer —— 定義器。
在用戶空問中 , ALSA 驅動通常配合 ALsA 庫使用 , 庫通過 ioctl 等介面調用 ALSA 驅動程序的設備節點。對於 AIJSA 驅動的調用,調用的是用戶空間的 ALsA 庫的介面,而不是直接調用 ALSA 驅動程序。
ALSA 驅動程序的主要頭文件是 include / sound ./ sound . h ,驅動核心數據結構和具體驅動的注冊函數是 include / sound / core . h ,驅動程序 的核心實現是 Sound / core / sound . c 文件。
ALSA 驅動程序使用下面的函數注冊控制和設備:
int snd _ pcm _ new (struct snd _ card * card , char * id , int device , int playback _ count , int capture _ count , struct snd _ pcm ** rpcm) ;
int snd ctl _ add(struct snd _ card * card , struct snd _ kcontrol * kcontro1) ;
ALSA 音頻驅動在內核進行 menuconfig 配置時 , 配置選項為 「 Device Drivers 」 > 「 Sound c ard support 」 一 > 「 Advanced Linux Sound Architecture 」 。子選項包含了 Generic sound devices( 通用聲音設備 ) 、 ARM 體系結構支持,以及兼容 OSS 的幾個選項。 ALsA 音頻驅動配置對應的文件是sound / core / Kconfig 。
Android 沒有直接使用 ALSA 驅動,可以基於 A-LSA 驅動和 ALSA 庫實現 Android Audio 的硬體抽象層; ALSA 庫調用內核的 ALSA 驅動, Audio 的硬體抽象層調用 ALSA 庫。
4.OSS音頻驅動
OSS(Open Sound System開放聲音系統)是 linux 上最早出現的音效卡驅動。OSS 由一套完整的內核驅動程序模塊組成,可以為絕大多數音效卡提供統一的編程介面。
OSS 是字元設備,主設備號14,主要包括下面幾種設備文件:
1) /dev/sndstat
它是音效卡驅動程序提供的簡單介面,它通常是一個只讀文件,作用也只限於匯報音效卡的當前狀態。(用於檢測音效卡)
2)/dev/dsp
用於數字采樣和數字錄音的設備文件。對於音頻編程很重要。實現模擬信號和數字信號的轉換。
3)/dev/audio
類似於/dev/dsp,使用的是 mu-law 編碼方式。
4)/dev/mixer
用於多個信號組合或者疊加在一起,對於不同的音效卡來說,其混音器的作用可能各不相同。
5)/dev/sequencer
這個設備用來對音效卡內建的波表合成器進行操作,或者對 MIDI 匯流排上的樂器進行控制。
OSS 驅動所涉及的文件主要包括:
kernel/include/linux/soundcard.h
kernel/include/linux/sound.h 定義 OSS 驅動的次設備號和注冊函數
kernel/sound_core.c OSS核心實現部分
5.V4l2視頻驅動
V4L2是V4L的升級版本,為linux下視頻設備程序提供了一套介面規范。包括一套數據結構和底層V4L2驅動介面。V4L2提供了很多訪問介面,你可以根據具體需要選擇操作方法。需要注意的是,很少有驅動完全實現了所有的介面功能。所以在使用時需要參考驅動源碼,或仔細閱讀驅動提供者的使用說明。
V4L2的主設備號是81,次設備號:0~255,這些次設備號里也有好幾種設備(視頻設備、Radio設備、Teletext、VBI)。
V4L2的設備節點: /dev/videoX, /dev/vbiX and /dev/radioX
Android 設備驅動(下)
MTD 驅動
Flash 驅動通常使用 MTD (memory technology device ),內存技術設備。
MTD 的字元設備:
/dev/mtdX
主設備號 90.
MTD 的塊設備:
/dev/block/mtdblockX
主設備號 13.
MTD 驅動源碼
drivers/mtd/mtdcore.c:MTD核心,定義MTD原始設備
drivers/mtd/mtdchar.c:MTD字元設備
drivers/mtd/mtdblock.c:MTD塊設備
MTD 驅動程序是 Linux 下專門為嵌入式環境開發的新一類驅動程序。Linux 下的 MTD 驅動程序介面被劃分為用戶模塊和硬體模塊:
用戶模塊 提供從用戶空間直接使用的介面:原始字元訪問、原始塊訪問、FTL (Flash Transition Layer)和JFS(Journaled File System)。
硬體模塊 提供內存設備的物理訪問,但不直接使用它們,二十通過上述的用戶模塊來訪問。這些模塊提供了快閃記憶體上讀、寫和擦除等操作的實現。
藍牙驅動
在 Linux 中,藍牙設備驅動是網路設備,使用網路介面。
Android 的藍牙協議棧使用BlueZ實現來對GAP, SDP以及RFCOMM等應用規范的支持,並獲得了SIG認證。由於Bluez使用GPL授權, 所以Android 框架通過D-BUS IPC來與bluez的用戶空間代碼交互以避免使用未經授權的代碼。
藍牙協議部分頭文件:
include/net/bluetooth/hci_core.h
include/net/bluetooth/bluetooth.h
藍牙協議源代碼文件:
net/bluetooth/*
藍牙驅動程序部分的文件:
drivers/bluetooth/*
藍牙的驅動程序一般都通過標準的HCI控制實現。但根據硬體介面和初始化流程的不同,又存在一些差別。這類初始化動作一般是一些晶振頻率,波特率等基礎設置。比如CSR的晶元一般通過BCSP協議完成最初的初始化配置,再激活標准HCI控制流程。對Linux來說,一旦bluez可以使用HCI與晶元建立起通信(一般是hciattach + hciconfig),便可以利用其上的標准協議(SCO, L2CAP等),與藍牙通信,使其正常工作了。
WLAN 設備驅動(Wi-Fi)(比較復雜我面會專門寫個wifi分析)
在linux中,Wlan設備屬於網路設備,採用網路介面。
Wlan在用戶空間採用標準的socket介面進行控制。
WiFi協議部分頭文件:
include/net/wireless.h
WiFi協議部分源文件:
net/wireless/*
WiFi驅動程序部分:
drivers/net/wireless/*
『玖』 誰能指導我一下怎麼把Generic USB Joystick驅動卸載掉啊。。。我怎麼刪都刪不掉呢。。
你要刪除驅動?那右擊我的電腦-管理-設備管理器里刪除驅動試試!
『拾』 linux系統中沒有USB驅動怎麼辦
要啟用 Linux USB 支持,首先進入"USB support"節並啟用"Support for USB"選項(對應模塊為usbcore.o)。盡管這個步驟相當直觀明了,但接下來的 Linux USB 設置步驟則會讓人感到糊塗。特別地,現在需要選擇用於系統的正確 USB 主控制器驅動程序。選項是"EHCI" (對應模塊為ehci-hcd.o)、"UHCI" (對應模塊為usb-uhci.o)、"UHCI (alternate driver)"和"OHCI" (對應模塊為usb-ohci.o)。這是許多人對 Linux 的 USB 開始感到困惑的地方。
要理解"EHCI"及其同類是什麼,首先要知道每塊支持插入 USB 設備的主板或 PCI 卡都需要有 USB 主控制器晶元組。這個特別的晶元組與插入系統的 USB 設備進行相互操作,並負責處理允許 USB 設備與系統其它部分通信所必需的所有低層次細節。
Linux USB 驅動程序有三種不同的 USB 主控制器選項是因為在主板和 PCI 卡上有三種不同類型的 USB 晶元。"EHCI"驅動程序設計成為實現新的高速 USB 2.0 協議的晶元提供支持。"OHCI"驅動程序用來為非 PC 系統上的(以及帶有 SiS 和 ALi 晶元組的 PC 主板上的)USB 晶元提供支持。"UHCI"驅動程序用來為大多數其它 PC 主板(包括 Intel 和 Via)上的 USB 實現提供支持。只需選擇與希望啟用的 USB 支持的類型對應的"?HCI"驅動程序即可。如有疑惑,為保險起見,可以啟用"EHCI"、"UHCI" (兩者中任選一種,它們之間沒有明顯的區別)和"OHCI"。( 趙明註:根據文檔,EHCI已經包含了UHCI和OHCI,但目前就我個人的測試,單獨加EHCI是不行的,通常我的做法是根據主板類型載入UHCI或OHCI後,再載入EHCI這樣才可以支持USB2.0設備)。
啟用了"USB support"和適當的"?HCI"USB 主控制器驅動程序後,使 USB 啟動並運行只需再進行幾個步驟。應該啟用"Preliminary USB device filesystem",然後確保啟用所有特定於將與 Linux 一起使用的實際 USB 外圍設備的驅動程序。例如,為了啟用對 USB 游戲控制器的支持,我啟用了"USB Human Interface Device (full HID) support"。我還啟用了主"Input core support" 節下的"Input core support"和"Joystick support"。
一旦用新的已啟用 USB 的內核重新引導後,若/proc/bus/usb下沒有相應USB設備信息,應輸入以下命令將 USB 設備文件系統手動掛裝到 /proc/bus/usb:
# mount -t usbdevfs none /proc/bus/usb
為了在系統引導時自動掛裝 USB 設備文件系統,請將下面一行添加到 /etc/fstab 中的 /proc 掛裝行之後:
none /proc/bus/usb usbdevfs defaults 0 0
模塊的配置方法.
在很多時候,我們的USB設備驅動並不包含在內核中。其實我們只要根據它所需要使用的模塊,逐一載入。就可以使它啟作用。
首先要確保在內核編譯時以模塊方式選擇了相應支持。這樣我們就應該可以在/lib/moles/2.4.XX目錄看到相應.o文件。在載入模塊時,我們只需要運行modprobe xxx.o就可以了(modprobe主要載入系統已經通過depmod登記過的模塊,insmod一般是針對具體.o文件進行載入)
對應USB設備下面一些模塊是關鍵的。
usbcore.o要支持usb所需要的最基礎模塊usb-uhci.o(已經提過)usb-ohci.o(已經提過)uhci.o另一個uhci驅動程序,我也不知道有什麼用,一般不要載入,會死機的ehci-hcd.o(已經提過 usb2.0)hid.oUSB人機界面設備,像滑鼠呀、鍵盤呀都需要usb-storage.oUSB存儲設備,U盤等用到
相關模塊
ide-disk.oIDE硬碟ide-scsi.o把IDE設備模擬SCSI介面scsi_mod.oSCSI支持
注意kernel config其中一項:
Probe all LUNs on each SCSI device
最好選上,要不某些同時支持多個口的讀卡器只能顯示一個。若模塊方式就要帶參數安裝或提前在/etc/moles.conf中加入以下項,來支持多個LUN。
add options scsi_mod max_scsi_luns=9
sd_mod.oSCSI硬碟sr_mod.oSCSI光碟sg.oSCSI通用支持(在某些探測U盤、SCSI探測中會用到)
常見USB設備及其配置
在Linux 2.4的內核中已經支持不下20種設備。它支持幾乎所有的通用設備如鍵盤、滑鼠、modem、列印機等,並不斷地添加廠商新的設備象數碼相機、MP3、網卡等。下面就是幾個最常見設備的介紹和使用方法:
USB滑鼠:
鍵盤和滑鼠屬於低速的輸入設備,對於已經為用戶認可的PS/2介面,USB鍵盤和USB滑鼠似乎並沒有太多更優越的地方。現在的大部分滑鼠採用了PS/2介面,不過USB介面的滑鼠也越來越多,兩者相比,各有優勢:一般來說,USB的滑鼠介面的帶寬大於PS/2滑鼠,也就是說在同樣的時間內,USB滑鼠掃描次數就要多於PS/2滑鼠,這樣在定位上USB滑鼠就更為精確;同時USB介面滑鼠的默認采樣率也比較高,達到125HZ,而PS/2介面的滑鼠僅有40HZ(Windows 9x/Me)或是60HZ(Windows NT/2000)。
對於USB設備你當然必須先插入相應的USB控制器模塊:usb-uhci.o或usb-ohci.o
modprobe usb-uhci
USB滑鼠為了使其正常工作,您必須先插入模塊usbmouse.o和mousedev.o
modprobe usbmouse
modprobe mousedev
若你把HID input layer支持和input core 支持也作為模塊方式安裝,那麼啟動hid模塊和input模塊也是必要的。
modprobe hid
modprobe input
USB鍵盤:
一般的,我們現在使用的鍵盤大多是PS/2的,USB鍵盤還比較少見,但是下來的發展,鍵盤將向USB介面靠攏。使用USB鍵盤基本上沒有太多的要求,只需在主板的BIOS設定對USB鍵盤的支持,就可以在各系統中完全無障礙的使用,而且更可以真正做到在即插即用和熱插拔使用,並能提供兩個USB連接埠:讓您可以輕易地直接將具有USB接頭的裝置接在您的鍵盤上,而非計算機的後面。
同樣你當然必須先插入相應的USB控制器模塊:usb-uhci.o或usb-ohci.o
modprobe usb-uhci
然後您還必須插入鍵盤模塊usbkbd.o,以及keybdev.o,這樣usb鍵盤才能夠正常工作。此時,運行的系統命令:
modprobe usbkbd
modprobe keybdev
同樣若你把HID input layer支持和input core 支持也作為模塊方式安裝,那麼啟動hid模塊和input模塊也是必要的。
U盤和USB讀卡器:
數碼存儲設備現在對我們來說已經是相當普遍的了。CF卡、SD卡、Memory Stick等存儲卡已經遍及我們的身邊,通常,他們的讀卡器都是USB介面的。另外,很多MP3、數碼相機也都是USB介面和計算機進行數據傳遞。更我們的U盤、USB硬碟,作為移動存儲設備,已經成為我們的必須裝備。
在Linux下這些設備通常都是以一種叫做usb-storage的方式進行驅動。要使用他們必須載入此模塊
modprobe usb-storage
當然,usbcore.o 和usb-uhci.o或usb-ohci也肯定是不可缺少的。另外,若你系統中SCSI支持也是模塊方式,那麼下面的模塊也要載入
modprobe scsi_mod
modprobe sd_mod
在載入完這些模塊後,我們插入U盤或存儲卡,就會發現系統中多了一個SCSI硬碟,通過正確地mount它,就可以使用了(SCSI硬碟一般為/dev/sd?,可參照文章後面的常見問題解答)。
mount /dev/sda1 /mnt
Linux支持的其他USB設備。
MODEM--(比較常見) 網路設備 攝像頭--(比較常見)例如ov511.o 聯機線--可以讓你的兩台電腦用USB線實現網路功能。usbnet.o 顯示器--(我沒見過) 游戲桿 電視盒--(比較常見) 手寫板--(比較常見) 掃描儀--(比較常見) 刻錄機--(比較常見) 列印機--(比較常見)
注意:
上面所說的每個驅動模塊,並不是都要手動載入,有很多系統會在啟動或你的應用需要時自動載入的,寫明這些模塊,是便於你在不能夠使用USB設備時,可以自行檢查。只要用lsmod確保以上模塊已經被系統載入,你的設備就應該可以正常工作了。當然注意有些模塊已經以內核方式在kernel啟動時存在了(這些模塊文件在/lib/moles/2.4.XX中是找不到的)。
輸入相關命令