㈠ android手機通過USB連接其他能上網,從而上網
1.安裝手機驅動程序。(到官網去下官方提供的即可,當然也可能有第三方驅動)。
2.進入系統設置開發人員選項打開USB調試。用數據線連接PC和手機,連接方式選擇MTP。
此時所有步驟完成。手機使用的網路為計算機所共享的網路了(就算不關閉3G數據。當然也可以將手機的3G數據關閉,不過可能有的程序會提示無網路連接。)
㈡ cdlinux下如何載入USB網卡驅動
1. 插入USB網卡後,查看網卡類型
lsusb
....
Bus005Device003:ID0fe6:8101
....
2. 解壓dm9601.tgz網卡驅動
tarxzvfdm9601-2.6.tgz
lsdm9601-2.6
dm9601.cdm9601.hMakefilereadme.tx
3. 嘗試編譯
cddm9601-2.6
make
make-C/lib/moles/2.6.28-11-generic/buildM=/root/dm9601-2.6LDDINCDIR=/root/dm9601-2.6/../includemoles
make[1]:Enteringdirectory`/usr/src/linux-headers-2.6.28-11-generic'
scripts/Makefile.build:46:***CFLAGSwaschangedin"/root/dm9601-2.6/Makefile".FixittouseEXTRA_CFLAGS.Stop.
make[1]:***[_mole_/root/dm9601-2.6]Error2
make[1]:Leavingdirectory`/usr/src/linux-headers-2.6.28-11-generic'
make:***[default]Error2
4. 修改 dm9601.h
vimdm9601.h
#在最後添加下面兩行
DM9601_DEV("SUNRISINGUSBEthernet",0x0fe6,0x8101,
DEFAULT_GPIO_RESET)
5. 編輯Makefile
vimMakefile
#將CFLAGS修改為EXTRA_CFLAGS
6. 編輯dm9601.c
vimdm9601.c
#include<linux/config.h>
#修改為
#include<linux/autoconf.h>
7. 開始編譯
makels
dm9601.cdm9601.hdm9601.kodm9601.mod.cdm9601.mod.o
dm9601.oMakefileMole.markersmoles.orderMole.symvers
readme.txt
8.將新生成的內核覆蓋掉當前內核
cpdm9601.ko/lib/moles/2.6.28-11-generic/kernel/drivers/net/usb/dm9601.ko
9. 配置USB網卡
vim/etc/network/interfaces
autoeth1
ifaceeth1inetstatic
address192.168.1.2
netmask255.255.255.0
gateway192.168.1.1
10. 為USB網卡配置MAC地址
ifconfigeth1hwether01:23:45:67:89:ab
11.激活USB網卡
ifconfigeth1up
㈢ LINUX下如何掛載U盤和光碟機實現文件拷貝功能
掛載U盤:mkdir /mnt/usb 建立掛載點fdisk -l 查看U盤盤符mount -t vfat -o iocharset=gb2312 /dev/sdb /mnt/usb 一般U盤盤符為sdb。進去看看盤符。cd /mnt/usb進入文件夾ls 查看U盤裡面內容。然後接下來就可以文件復制了啊。如果要卸載U盤,cd umount /mnt/usb掛載光碟:mount -o loop /root/Red\Hat\Linux1.iso /mnt/cdrom 以掛載紅帽的第一塊.iso安裝鏡像文件為例掛載光碟。cd /mnt/cdrom 進入掛載點ls 查看文件然後就可以進行對光碟的操作了啊。
㈣ 求CDLINUX的使用說明和介紹
如何「安裝」CDlinux?
CDlinux 是個從光碟啟動、運行的小 Linux,是以一個標準的 ISO 文件的格式發布的。所以最簡單的「安裝」方法是:把這個 ISO 文件刻錄到光碟上,用它啟動機器就是了。
當然,你也可以把 CDlinux 安裝到硬碟或 U 盤、USB 移動硬碟上(請參見下文)。
如何把 CDlinux 集成到我自己的光碟上?
CDlinux 本身很小,0.4.6 只有不到 14 兆,這比一張刻錄盤的容量差多了。所以,如果有興趣的話,你可以自己動手,把 CDlinux 與其它軟體集成到一起,不必單刻一卜棚張盤。還可以與其它系統一起做成多啟動光碟。具體操作既可以在 Linux 下進行,也可以在 Windows 下進行:
用 Linux 的方法 (以下操作可以在 CDlinux 也可以在一般的 Linux 系統中進行)
首先要把 CDlinux 的內容從 ISO 鏡像里展出來,先掛載它:
# mount -o loop CDlinux-x.x.x.iso /some/where
這樣 CDlinux 里的具體內容就都在 /some/where 目錄下了。假設你已經把其它要刻到盤上的軟體都放到了 /mycd 目錄下,現在把 CDlinux 也拷到那個目錄里:
# cp -p -r /some/where/* /mycd
接下來 cd /mycd,打開 mkisofs.sh 文件,根據你自己的具體情況進行必要的修改,存檔退出。最後,執行:
# ./mkisofs.sh
生成新的光碟鏡像,預設情況下新鏡像是 /tmp/1.iso。現在就可以它刻錄出來了。
注意,通過以上步驟做出的光碟啟動時會直接進入 CDlinux,啟動效果和掘蠢原來的 ISO 鏡像是一樣的。如果你想製作帶菜單的多啟動光碟,還需要用到 ISOlinux (SYSlinux 的一個組件) 等其它工具,至於如何使用它們,請參見它們各自的文檔。
用 Windows 的方法
這個我不太熟,不過我想也不會太麻煩。只要注意以下幾點就行了:
可以用 WinRAR 來提取光碟鏡像里 CDlinux 的內容;
CDlinux 是通過 boot/CDlinux/CDlinux.img 這個 2.88M 軟盤鏡像來啟動的;
請保持 CDlinux 的目錄結構,不要改動;
不要改變文件/目錄名的大小寫。
如何判弊陪把 CDlinux 安裝到硬碟上?
Linux 本身功能非常強大又非常靈活,CDlinux 也繼承了這一點,所以稍加定製就可以把它安裝到各種各樣的設備上。並且僅僅把 CDlinux 安裝到硬碟上就有很多種方案可選,這里我們只介紹一種方案:把 CDlinux 安裝到一個 Windows FAT 分區里,用 loadlin 來啟動它。
在以下的說明中,我們假設你的 Windows 的「C: 盤」是 FAT16 或者 FAT32 格式的,並且它對應 Linux 下的 /dev/hda1。我們將把 CDlinux 安裝到「C: 盤」上。
用 Linux 的方法 (以下操作可以在 CDlinux 也可以在一般的 Linux 系統中進行)
首先,掛上 CDlinux 的 ISO 鏡像和 C: 盤:
# mount -o loop CDlinux-x.x.x.iso /mnt/cdrom
# mount /dev/hda1 /mnt/win
(如果你不想裝到 C: 盤上,或者你的 C: 盤不是 /dev/hda1,請對上述命令做相應的修改)
然後把 extra/ 目錄下的內容拷貝到 C: 上:
# mkdir /mnt/win/CDlinux
# cp -r /mnt/cdrom/boot/CDlinux/extra /mnt/win/CDlinux
接下來,把內核和 initrd 也拷到 C: 盤:
# mount -o loop /mnt/cdrom/boot/CDlinux/CDlinux.img /mnt/floppy
# cp /mnt/floppy/bzImage /mnt/floppy/CDlinux.gz /mnt/win/CDlinux
最後,下載 loadlin (~10k) 並把它展到 C: 盤上:
# tar -C /mnt/win/CDlinux -zxf loadlin.tgz
(這步把「loadlin.exe」和一個「autoboot.bat」批處理文件拷貝到 /mnt/win/CDlinux 目錄里。請檢查「autoboot.bat」文件,並根據你自己的具體情況做相應的修改。)
現在,可以重啟到純 DOS 環境,用以下命令來啟動 CDlinux 了:
C:
CD CDlinux
AutoBoot
注意,以上步驟只是一個簡單的例子,這里的假設可能和你的情況並不一致。所以,在操作時別忘了根據自己的具體情況做必要的修改。另外請參考「簡介:CDlinux 的命令行參數」和「簡介:CDlinux 的結構」。
如何把 CDlinux 安裝到 U 盤上?
把 CDlinux 安裝到 U 盤也有多種方案可選。我們還是只說一種:安裝到 U 盤上的一個 FAT 分區里,並用 SYSlinux 來啟動。
在以下的說明中,我們假設你的 USB 盤(U 盤或 USB 移動硬碟)被設定為硬碟模式。上面的第一個分區是 FAT12、FAT16、或者 FAT32 格式的,並且並且它對應 /dev/sda1。
用 Linux 的方法 (以下操作可以在 CDlinux 也可以在一般的 Linux 系統中進行)
首先,在 USB 盤上安裝 syslinux:
# syslinux /dev/sda1
掛載 CDlinux 的 ISO 鏡像和 USB 盤:
# mount -o loop CDlinux-x.x.x.iso /mnt/cdrom
# mount /dev/sda1 /mnt/win
(如果你的 USB 盤不是 /dev/sda1,請做相應的修改)
然後,把 extra/ 目錄下的內容拷貝到 USB 盤上:
# mkdir /mnt/win/CDlinux
# cp -r /mnt/cdrom/boot/CDlinux/extra /mnt/win/CDlinux
接下來,把內核和 initrd 也拷過去:
# mount -o loop /mnt/cdrom/boot/CDlinux/CDlinux.img /mnt/floppy
# cp /mnt/floppy/bzImage /mnt/floppy/CDlinux.gz /mnt/win
最後,下載 syslinux 的配置文件 (~2k) 並把它展到 USB disk 盤上:
# tar -C /mnt/win -zxf syslinux-cfg.tgz
(這一步將把「syslinux.cfg」和一些顯示信息等文件拷貝到 /mnt/win 目錄下。不要忘了先檢查一下「syslinux.cfg」,並根據你自己的具體情況做相應的修改。)
現在可以把你的 BIOS 設置成從 USB-HDD 或者 USB-zip 啟動。(具體設為那種和你的 BIOS 及 USB 盤有關,試一下就知道了。)
注意,以上步驟只是一個簡單的例子,這里的假設可能和你的情況並不一致。所以,在操作時別忘了根據自己的具體情況做必要的修改。另外請參考「簡介:CDlinux 的命令行參數」和「簡介:CDlinux 的結構」。
簡介: CDlinux 的命令行參數
為了讓 CDlinux 更靈活,不但能從光碟啟動,還能從其它各種設備啟動。並且不但能把模塊掛載到內存中(ramdisk),為了節約內存,還可以自動用「loop」方式掛載模塊,我們定義了下述三個內核命令行參數:
CDL_DEV=:
告訴 CDlinux 在哪個設備上可以找到附加的「包」和「模塊」
預設值:/dev/cdrom
例子: CDL_DEV=/dev/hda1
CDL_DIR=:
extra/ 目錄在 CDL_DEV 的文件系統的那個目錄下?
預設值:boot/CDlinux, CDlinux, zxh/CDlinux
例子: CDL_DEV=APPs/CDlinux
CDL_LOOP:
是否強制以「loop」方式載入「模塊」?
預設值:否,盡量把「模塊」掛載到內存里。
例子: CDL_LOOP
以上這三個參數都是可選的,正常從光碟啟動時可以一個也不加,使用預設值即可。如果模塊太多或者太大,CDlinux 會自動以「loop」方式載入它們。不過這樣一來,在 CDlinux 運行時就不能把光碟拿出來了。
定製
簡介:CDlinux 的結構
CDlinux 是高度可定製的。它由以下兩部分構成:
1. 「基本」部分:一張 2.88M 軟盤鏡像,CDlinux.img
2. 「附加」部分:其它附加的「包」和「模塊」
「基本」部分就是一張 VFAT 格式的 2.88M 軟盤鏡像。上麵包含了內核和一些最基本的軟體,包括:bash (1.14.7)、bftpd (一個小 ftp 伺服器)、busybox、bzip2、e2fsprogs、file、find、gawk、grep、gzip、midnight commander (4.1.35)、portmap、sed、tar 和 vim (5.8) 等。如果你只是需要一個最基本的 Linux 環境,你可以把 CDlinux 的其它內容統統刪掉,只保留這一個文件,一樣跑得不錯。
「附加」部分包括其它一些有用的工具軟體,這些軟體被打成了「包」(package)或者「模塊」(mole),放在 extra/ 目錄下。啟動時,CDlinux 會自動到 extra/ 目錄下查找並安裝它們。
雖然 CDlinux 只需 CDlinux.img 這一個文件就能跑起來,不過功能上就大打折扣了。所以最好還是保留這些附加的包和模塊。當然,你也可以向 extra/ 目錄里添加你需要的軟體,把那些你用不到的刪掉,自己定製一個 CDlinux 版本。
如何向 CDlinux 里添加其它軟體?
CDlinux 很小,所以有很多有用的軟體並沒有被集成進來。不過你可以自己定製它,加上你需要的軟體。可以把軟體做成一個「包」或者一個「模塊」加進來。具體用哪種格式,取決於軟體的大小、是否需要初始化。小的、不需初始化的軟體可以做成「包」;反之,最好做成「模塊」。比如,你可以把 F-PROT 做成一個「模塊」添加到 extra/目錄下,這樣你就可以用 CDlinux 來殺毒了。(F-PROT 是個非常簡潔、功能非常強大的殺毒軟體,之所以沒有集成到 CDlinux 的發行版中,是因為我不知道它的 license 是否允許。)
為 CDlinux 添加軟體的注意事項
CDlinux 是用 gcc-2.95.3 編譯的,鏈接的是 glibc-2.2.5。你添加的軟體最好也是編譯、鏈接自同樣的環境;
如果你加的軟體需要其它的,CDlinux 沒有提供的庫,請把這些庫也一起添加進來。
如何為 CDlinux 製作一個「包」(package)?
做一個包非常簡單,所謂「包」就是一個標準的 .tar.gz 文件。關於這個 .tar.gz 文件里的目錄結構,你可以參考 extra/ 目錄下已有的那些「xxx-cdl.tgz」文件。製作時只需注意一下幾點:
「包」的文件名必須是「xxx-cdl.tgz」,否則將被忽略,不會被安裝;
如果願意,你還可以為你的包加上一個簡短的說明,並把它存為 zxh/SPEC。啟動時 CDlinux 會自動把它集成到 /var/log/packages 里。關於 SPEC 的格式,請參照已有的「xxx-cdl.tgz」文件;
zxh/ 目錄里除了 SPEC 以外的所有其它內容都將被忽略,不被安裝;
CDlinux 是在一個小 RAM 磁碟里運行的,所以請盡量把包做得小一點。像 man 和 docs 等文檔都可以放到 zxh/ 目錄下,這樣它們就不會被安裝,你以後要查閱起來也比較方便。
如何為 CDlinux 製作一個「模塊」(mole)?
如果要添加的軟體比較大,可以把它做成一個「模塊」。「模塊」就是一個標準的 cramfs 鏡像,製作起來比做「包」稍麻煩一些,需要用 mkfs.cramfs 命令。「模塊」具體結構請參考 extra/ 目錄下已有的「xxx-cdl.md」文件。CDlinux 啟動時自動到 extra/ 下查找這些「xxx-cdl.md」,並自動掛載它們。
製作模塊時的的注意事項
「模塊」的文件名必須是「xxx-cdl.md」,否則將被忽略,不會被安裝;
必須為模塊指定一個掛載點。方法是把掛載點寫到一個叫「.mount_point」的文件里,並把該文件放到 cramfs 的根目錄下。「.mount_point」文件的具體格式可以參考 extra/ 下已有的「xxx-cdl.md」文件;
如果該軟體需要執行一些初始化操作,可以把初始化程序或腳本命名為「.init」放到 cramfs 的根目錄下,並將起屬性設置為可執行。啟動時 CDlinux 會自動找到並執行 .init;
預設情況下,CDlinux 會盡量把「模塊」都載入到內存中,內存不足時才以「loop」方式載入「模塊」。如果你想省出更多內存來運行程序,可以在內核命令行里加上 「CDL_LOOP」參數,來強迫 CDlinux 以「loop」方式載入所有模塊;
cramfs 是一種只讀文件系統,並且不記錄文件的時間信息。
如何按照我自己的口味定製 CDlinux?
如果 CDlinux 的預設狀態不合你的胃口,你可以自己動手定製它。定製的辦法有難有易:
「難」的辦法是掛上 initrd 直接修改。CDlinux 的 initrd 是一個標準的 ext2 鏡像,可以直接掛載、修改,沒有問題。不過我還是推薦你盡量使用下面的「簡單」辦法。
「簡單」的辦法是,把修改的內容放到 extra/system-extra-cdl.tgz 文件里。比如,若是修改了 /etc/profile,把修改過的文件存為 system-extra-cdl.tgz 下的 /etc/profile。這樣 CDlinux 啟動時會自動用新的 /etc/profile 把舊的覆蓋掉。另外,如果需要的話,你還可以在 system-extra-cdl.tgz 文件里加上個 /etc/rc.d/rc.local 腳本,以執行你需要的一些初始化操作。下面是一些具體的例子:
修改 bash 的命令行提示符
修改 CDlinux 原來的 /etc/profile 文件中帶「PS1=」的哪些行,把修改後的結果保存到 system-extra-cdl.tgz 里,仍叫 /etc/profile。
把 bash 的命令行編輯模式由 emacs 改為 vi
編輯 /etc/inputrc,加上「set +o vi」,把新文件存到 system-extra-cdl.tgz 里,仍叫 /etc/inputrc。
讓 CDlinux 自動掛載 C: 盤
編輯 /etc/fstab,把新文件存到 system-extra-cdl.tgz 里。
讓 CDlinux 自動載入 AMD PCNET32 網卡的驅動
新建一個腳本,在裡面加上「modprobe pcnet32」,然後把它存為 system-extra-cdl.tgz 里的 /etc/rc.d/rc.local。
另外,CDlinux 里自帶的那些軟體包如果不合你的胃口,咱也可以改:
把 zhcon 的預設輸入法由拼音改為五筆
# mkdir temp ; cd temp
# tar zxpf /some/where/CDlinux/extra/zhcon-x.x-cdl.tgz
# mv -f zxh/wb/* usr/lib/zhcon
# tar zcpf /some/where/CDlinux/extra/zhcon-x.x-cdl.tgz *
# cd .. ; rm -rf temp
(CDlinux 里帶的這個 zhcon 只支持簡體中文(GB2312),如果你不需要簡體中文支持,可以把它刪掉,自己另編譯一個支持繁體中文、日文或韓文的加上)
讓 mkisofs 支持更多的 joliet 代碼頁(codepage)
CDlinux 里預設帶的 mkisofs 只支持 cp437、cp936(簡體中文)、iso8859-1 和 utf8 的 joliet 代碼頁,如果想換成支持更多代碼頁(包括 CJK)的版本,可以執行如下操作:
# mkdir temp ; cd temp
# tar zxpf /some/where/CDlinux/extra/cdrtools-x-x.x-cdl.tgz
# mv -f zxh/removed/usr/bin/mkisofs usr/bin
# tar zcpf /some/where/CDlinux/extra/cdrtools-x-x.x-cdl.tgz *
# cd .. ; rm -rf temp
配置
如何配置網路?
CDlinux 可以自動檢測很多常見的乙太網卡,不過為了讓它小一點,更多網卡的驅動沒有編到內核里,而是做成了內核模塊。如果 CDlinux 沒能自動識別你的網卡,你就要自己動手去載入相應的內核模塊啦 :(
如果不知道驅動是那個模塊,可以先「lspci」,在輸出結果里找帶「Ethernet controller:」字樣的行,然後到 /lib/moles/x.x.xx/kernel/drivers/net,參照那些模塊的名字,看能不能「蒙」出來到底是哪個模塊。要載入比如說名為「xxx.o」模塊,可以執行「modprobe xxx」。
一但你的網卡被正確識別了,你可以用如下命令來配置 IP、DNS 等:
# net-config
(如果你用的是 USB-link 線,可以先「modprobe usbnet」,然後當 net-config 問要配置哪個網路介面時輸入 usb0。)
或者,如果你所在的網路里有 DHCP 伺服器,可以執行:
# dhcpcd start
設置代理伺服器可以用:
# proxy-config
修改網卡的 MAC 地址:
# mac-fake
如何配置 RAID 設備?
SCSI 和 RAID 設備的驅動都做成了內核模塊,CDlinux 不能自動檢測它們,你需要自己載入它們的驅動(內核模塊)。下面這個例子假設你有一個基於 AHA1542 晶元的 SCSI 卡,上面連了兩個 SCSI 盤,分別是 /dev/sda、/dev/sdb。並且通過軟體 RAID 把 /dev/sda1 和 /dev/sdb1 做成了一個 RAID0 設備。可以通過如下命令來驅動它:
# modprobe aha1542
# modprobe raid0
# mdadm -A /dev/md0 /dev/sda1 /dev/sdb1
好了,現在你可以通過 /dev/md0 來訪問這個 RAID0 設備了。
如何配置滑鼠?
用 mouse-config 命令。(支持絕大多數 COM/PS2/USB 滑鼠)
使用
如何與其它計算機交換數據?
CDlinux 里已經帶了 ftp、ssh1 和 nfs3 客戶端/伺服器。預設狀態下 ftp 和 ssh 伺服器已經啟動。所以最簡單的交換數據的方法就是用 ftp 和 scp。
預設狀態下 nfs 伺服器沒有啟動,你需要先編輯、修改一下 /etc/exports,指定 export 哪些目錄,和 export 的方式,然後執行:
# nfsd start
CDlinux 里還帶了 nfs 和 samba 的客戶端。要掛載 nfs 資源:
# mount -t nfs xx.xx.xx.xx:/exported/resource /some/where
掛載 samba 資源:
# mount -t smbfs -o username=xx //machine_name/resource_name /some/where
如何改變分區大小、修改分區表?
請使用「parted」或者「resize2fs」等。
如何修復被損壞了的分區表?
用「gpart」。(這個版本已打過 reiserfs-3.6 補丁,可以放心使用)
如何從 ext2 文件系統中恢復被誤刪除的文件?
用「e2undel」。
LILO/GRUB 被 Windows 覆蓋了,如何修復?
安裝 Windows 9x 會覆蓋硬碟的主引導記錄,導致原來安裝的 Linux 無法啟動,這時你可以啟動 CDlinux 來進行修復。
首先,掛上 Linux 的根分區,比如說 /dev/hda5:
# mount -t ext2 /dev/hda5 /mnt/local
然後,假設你是用 LILO 來引導的:
# lilo -r /mnt/local
如果不成功,可以再試試:
# chroot /mnt/local /sbin/lilo
如果還是不行,再仔細找找原因,比如是不是上面 LILO 的路徑不對等。耐心點,只要 Linux 的分區沒有被破壞,一定可以恢復的。如果你是用 GRUB 來引導系統的,方法也和上面的類似。LILO/GRUB 的具體使用方法,請參考它們各自的文檔。
Windows 9x 覆蓋了 NT/2k/XP 的引導記錄,「雙啟動菜單」不見了,如何修復?
假設你的「C: 盤」是 /dev/hda1,格式是 FAT32,新裝的 Windows 98 破壞了 XP 的引導記錄,現在只能進 98 了。這種情況可以試試用 CDlinux 來修復:
# ms-sys -2 /dev/hda1
關於 ms-sys 的具體用法,請參見它的文檔。
NT/2k/XP 的管理員密碼丟了,怎麼辦?
如果忘了 NT/2k/XP 的管理員密碼,想再找回來是很難的。不過你可以用 CDlinux 再強行重設一個密碼,或者乾脆把密碼清空。執行:
# nukent
然後按提示操作。
--------------------------------------------------------------------------------
CDlinux 里帶了很多實用工具,關於它們的用法的簡短說明,可以參考 /var/log/packages。另外,許多軟體的 man 手冊和文檔被放在了對應的「xxx-cdl.tgz」文件的 zxh/ 目錄下,沒有安裝,你可以掛上 CDlinux 光碟,查閱這些文件。關於某個軟體的具體用法,已經超出了這個 mini-HOWTO 的范圍,請參考它們各自的文檔。RTFM 可是一種很好的學習方法 :)
㈤ 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中是找不到的)。
輸入相關命令
㈥ linux模塊編譯後載入不成功
從dmesg的輸來出來看,內核已經export了一自個同樣的symbol,你載入的驅動再次輸出一遍就有問題了。
可能原因:
usbnet模塊可能在系統啟動後已經載入了,你不需要手動再次載入。這個又可能由兩個原因造成:(1)你在menuconfig中選擇USBNET模塊為[*]模式(驅動集成到內核),而非[M]模式(驅動以模塊方式動態插入內核);(2)你已經選擇了[M]模式,但是按照系統的默認配置在系統啟動過程中會自動動態載入這個驅動,無需手動載入;
雖然選擇了USBNET模塊並重新編譯了內核,但是新編譯的內核並沒有更新到系統上,系統還是使用的老的內核。
現在你應該可以排除一下上面的猜測的幾種可能原因吧?
㈦ usbnet是否就是無線上網卡的驅動
大致是廳扒這樣的:
一、linux模擬U盤功能的實現
向內核添加扮鬧昌代碼
#include
#include
#include
修改arch/arm/mach-s3c2410/mach-smdk2410.c
/*USB device上拉電阻處理 */
static void smdk2410_udc_pullup(enum s3c2410_udc_cmd_e cmd)
{
u8 *s3c2410_pullup_info[] = {
" ",
"Pull-up enable",
"Pull-up disable",
"UDC reset, in case of"
};
printk("smdk2410_udc: %s\n",s3c2410_pullup_info[cmd]);
s3c2410_gpio_cfgpin(S3C2410_GPG9, S3C2410_GPG9_OUTP);
switch (cmd)
{
case S3C2410_UDC_P_ENABLE :
s3c2410_gpio_setpin(S3C2410_GPG9, 1); //set gpg9 output HIGH
break;
case S3C2410_UDC_P_DISABLE :
s3c2410_gpio_setpin(S3C2410_GPG9, 0); //set gpg9 output LOW
break;
case S3C2410_UDC_P_RESET :
//FIXME!!!
break;
default:
break;
}
}
static struct s3c2410_udc_mach_info smdk2410_udc_cfg __initdata = {
.udc_command = smdk2410_udc_pullup,
};
static struct platform_device *smdk2410_devices[] __initdata = {
…,
&s3c_device_usbgadget, /*USB gadget device設備登記*/
};
static void __init sdmk2410_init(void)
{
u32 upll_value;
set_s3c2410fb_info(&smdk2410_lcdcfg);
s3c24xx_udc_set_platdata(&smdk2410_udc_cfg); /* 初始化*/
s3c_device_sdi.dev.platform_data = &smdk2410_mmc_cfg;
/* Turn off suspend on both USB ports, and switch the
* selectable USB port to USB device mode. */
s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST |
S3C2410_MISCCR_USBSUSPND0 |
S3C2410_MISCCR_USBSUSPND1, 0x0);
/* 設置USB時鍾 */
upll_value = (
0x78 << S3C2410_PLLCON_MDIVSHIFT)
| (0x02 << S3C2410_PLLCON_PDIVSHIFT)
| (0x03 << S3C2410_PLLCON_SDIVSHIFT);
while (upll_value != readl(S3C2410_UPLLCON)) {
writel(upll_value, S3C2410_UPLLCON);
udelay(20);
}
}
修改drivers/usb/gadget/file_storage.c
static void start_transfer(struct fsg_dev *fsg, struct usb_ep *ep,
struct usb_request *req, int *pbusy,
enum fsg_buffer_state *state)
{
int rc;
udelay(800);
……
}
配置內核支彎啟持U盤模擬
<*> USB Gadget Support --->
USB Peripheral Controller (S3C2410 USB Device Controller) --->
S3C2410 USB Device Controller
S3C2410 udc debug messages
USB Gadget Drivers
File-backed Storage Gadget
3、編譯內核
#make zImage
#make moles
在目錄drivers/usb/gadget下生成g_file_storage.ko
載入驅動,測試功能
利用前面的生成的內核,啟動系統後,載入g_file_storage.ko
#insmod g_file_storage.ko
# insmod g_file_storage.ko file=/dev/mtdblock2 stall=0 removable=1
0.03 USB: usb_gadget_register_driver() 'g_file_storage'
0.04 USB: binding gadget driver 'g_file_storage'
0.05 USB: s3c2410_set_selfpowered()
g_file_storage gadget: File-backed Storage Gadget, version: 20 October 2004
g_file_storage gadget: Number of LUNs=1
g_file_storage gadget-lun0: ro=0, file: /dev/mtdblock3
0.06 USB: udc_enable called
smdk2410_udc: Pull-up enable
連接設備到windows,windows系統會自動設備到一個新的U盤加入。格式化U盤,存入文件。卸載U盤後,在目標板上執行如下操作:
# mkdir /mnt/gadget
# mount -t vfat /dev/mtdblock2 /mnt/gadget/
#ls
可以看到windows存入U盤的文件。
二、usbnet功能的實現
配置內核支持usbnet
<*> USB Gadget Support --->
USB Peripheral Controller (S3C2410 USB Device Controller) --->
S3C2410 USB Device Controller
S3C2410 udc debug messages
USB Gadget Drivers
Ethernet Gadget (with CDC Ethernet support)
RNDIS support
2、編譯內核
#make zImage
#make moles
在目錄drivers/usb/gadget下生成g_ether.ko
3、載入驅動,測試功能
利用前面的生成的內核,啟動系統後,載入g_ether.ko
#insmod g_ether.ko
#ifconfig usb0 192.168.1.120
……
usb0 Link encap:Ethernet HWaddr 5E:C5:F6:D4:2B:91
inet addr:192.168.1.120 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:253 errors:0 dropped:0 overruns:0 frame:0
TX packets:43 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:35277 (34.4 KiB) TX bytes:10152 (9.9 KiB)
㈧ 「干貨」嵌入式Linux系統移植的四大步驟(上)
在學習系統移植的相關知識,在學習和調試過程中,發現了很多問題,也解決了很多問題,但總是對於我們的開發結果有一種莫名其妙的感覺,糾其原因,主要對於我們的開發環境沒有一個深刻的認識,有時候幾個簡單的命令就可以完成非常復雜的功能,可是我們有沒有想過,為什麼會有這樣的效果?
如果沒有去追問,只是機械地完成,並且看到實驗效果,這樣做其實並沒有真正的掌握系統移植的本質。
在做每一個步驟的時候, 首先問問自己,為什麼要這樣做,然後再問問自己正在做什麼? 搞明白這幾個問題,我覺得就差不多了,以後不管更換什麼平台,什麼晶元,什麼開發環境,你都不會迷糊,很快就會上手。對於嵌入式的學習方法,我個人方法就是:從宏觀上把握(解決為什麼的問題),微觀上研究(解決正在做什麼的問題),下面以自己學習的arm-cortex_a8開發板為目標,介紹下自己的學習方法和經驗。
嵌入式Linux系統移植主要由四大部分組成:
一、搭建交叉開發環境
二、bootloader的選擇和移植
三、kernel的配置、編譯、和移植
四、根文件系統的製作
第一部分:搭建交叉開發環境
先介紹第一分部的內容:搭建交叉開發環境,首先必須得思考兩個問題,什麼是交叉環境? 為什麼需要搭建交叉環境?
先回答第一個問題,在嵌入式開發中,交叉開發是很重要的一個概念,開發的第一個環節就是搭建環境,第一步不能完成,後面的步驟從無談起,這里所說的交叉開發環境主要指的是:在開發主機上(通常是我的pc機)開發出能夠在目標機(通常是我們的開發板)上運行的程序。嵌入式比較特殊的是不能在目標機上開發程序(狹義上來說),因為對於一個原始的開發板,在沒有任何程序的情況下它根本都跑不起來,為了讓它能夠跑起來,我們還必須要藉助pc機進行燒錄程序等相關工作,開發板才能跑起來,這里的pc機就是我們說的開發主機,想想如果沒有開發主機,我們的目標機基本上就是無法開發,這也就是電子行業的一句名言:搞電子,說白了,就是玩電腦!
然後回答第二個問題,為什麼需要交叉開發環境?主要原因有以下幾點:
原因 1: 嵌入式系統的硬體資源有很多限制,比如cpu主頻相對較低,內存容量較小等,想想讓幾百MHZ主頻的MCU去編譯一個Linux kernel會讓我們等的不耐煩,相對來說,pc機的速度更快,硬體資源更加豐富,因此利用pc機進行開發會提高開發效率。
原因2: 嵌入式系統MCU體系結構和指令集不同,因此需要安裝交叉編譯工具進行編譯,這樣編譯的目標程序才能夠在相應的平台上比如:ARM、MIPS、 POWEPC上正常運行。
交叉開發環境的硬體組成主要由以下幾大部分 :
1.開發主機
2.目標機(開發板)
3.二者的鏈接介質,常用的主要有3種方式:(1)串口線 (2)USB線 (3)網線
對應的硬體介質,還必須要有相應的軟體「介質」支持:
1.對於串口,通常用的有串口調試助手,putty工具等,工具很多,功能都差不多,會用一兩款就可以;
2.對於USB線,當然必須要有USB的驅動才可以,一般晶元公司會提供,比如對於三星的晶元,USB下載主要由DNW軟體來完成;
3.對於網線,則必須要有網路協議支持才可以, 常用的服務主要兩個
第一:tftp服務:
主要用於實現文件的下載,比如開發調試的過程中,主要用tftp把要測試的bootloader、kernel和文件系統直接下載到內存中運行,而不需要預先燒錄到Flash晶元中,一方面,在測試的過程中,往往需要頻繁的下載,如果每次把這些要測試的文件都燒錄到Flash中然後再運行也可以,但是缺點是:過程比較麻煩,而且Flash的擦寫次數是有限的;另外一方面:測試的目的就是把這些目標文件載入到內存中直接運行就可以了,而tftp就剛好能夠實現這樣的功能,因此,更沒有必要把這些文件都燒錄到Flash中去。
第二: nfs服務:
主要用於實現網路文件的掛載,實際上是實現網路文件的共享,在開發的過程中,通常在系統移植的最後一步會製作文件系統,那麼這是可以把製作好的文件系統放置在我們開發主機PC的相應位置,開發板通過nfs服務進行掛載,從而測試我們製作的文件系統是否正確,在整個過程中並不需要把文件系統燒錄到Flash中去,而且掛載是自動進行掛載的,bootload啟動後,kernel運行起來後會根據我們設置的啟動參數進行自動掛載,因此,對於開發測試來講,這種方式非常的方便,能夠提高開發效率。
另外,還有一個名字叫 samba 的服務也比較重要,主要用於文件的共享,這里說的共享和nfs的文件共享不是同一個概念,nfs的共享是實現網路文件的共享,而samba實現的是開發主機上 Windows主機和Linux虛擬機之間的文件共享,是一種跨平台的文件共享 ,方便的實現文件的傳輸。
以上這幾種開發的工具在嵌入式開發中是必備的工具,對於嵌入式開發的效率提高做出了偉大的貢獻,因此,要對這幾個工具熟練使用,這樣你的開發效率會提高很多。等測試完成以後,就會把相應的目標文件燒錄到Flash中去,也就是等發布產品的時候才做的事情,因此對於開發人員來說,所有的工作永遠是測試。
通過前面的工作,我們已經准備好了交叉開發環境的硬體部分和一部分軟體,最後還缺少交叉編譯器,讀者可能會有疑問,為什麼要用交叉編譯器?前面已經講過,交叉開發環境必然會用到交叉編譯工具,通俗地講就是在一種平台上編譯出能運行在體系結構不同的另一種平台上的程序,開發主機PC平台(X86 CPU)上編譯出能運行在以ARM為內核的CPU平台上的程序,編譯得到的程序在X86 CPU平台上是不能運行的,必須放到ARM CPU平台上才能運行,雖然兩個平台用的都是Linux系統。相對於交叉編譯,平常做的編譯叫本地編譯,也就是在當前平台編譯,編譯得到的程序也是在本地執行。用來編譯這種跨平台程序的編譯器就叫交叉編譯器,相對來說,用來做本地編譯的工具就叫本地編譯器。所以要生成在目標機上運行的程序,必須要用交叉編譯工具鏈來完成。
這里又有一個問題,不就是一個交叉編譯工具嗎?為什麼又叫交叉工具鏈呢?原因很簡單,程序不能光編譯一下就可以運行,還得進行匯編和鏈接等過程,同時還需要進行調試,對於一個很大工程,還需要進行工程管理等等,所以,這里 說的交叉編譯工具是一個由 編譯器、連接器和解釋器 組成的綜合開發環境,交叉編譯工具鏈主要由binutils(主要包括匯編程序as和鏈接程序ld)、gcc(為GNU系統提供C編譯器)和glibc(一些基本的C函數和其他函數的定義) 3個部分組成。有時為了減小libc庫的大小,也可以用別的 c 庫來代替 glibc,例如 uClibc、dietlibc 和 newlib。
那麼,如何得到一個交叉工具鏈呢?是從網上下載一個「程序」然後安裝就可以使用了嗎?回答這個問題之前先思考這樣一個問題,我們的交叉工具鏈顧名思義就是在PC機上編譯出能夠在我們目標開發平台比如ARM上運行的程序,這里就又有一個問題了,我們的ARM處理器型號非常多,難道有專門針對我們某一款的交叉工具鏈嗎?若果有的話,可以想一想,這么多處理器平台,每個平台專門定製一個交叉工具鏈放在網路上,然後供大家去下載,想想可能需要找很久才能找到適合你的編譯器,顯然這種做法不太合理,且浪費資源!因此,要得到一個交叉工具鏈,就像我們移植一個Linux內核一樣,我們只關心我們需要的東西,編譯我們需要的東西在我們的平台上運行,不需要的東西我們不選擇不編譯,所以,交叉工具鏈的製作方法和系統移植有著很多相似的地方,也就是說,交叉開發工具是一個支持很多平台的工具集的集合(類似於Linux源碼),然後我們只需從這些工具集中找出跟我們平台相關的工具就行了,那麼如何才能找到跟我們的平台相關的工具,這就是涉及到一個如何製作交叉工具鏈的問題了。
通常構建交叉工具鏈有如下三種方法:
方法一 : 分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼,最終生成交叉編譯工具鏈。該方法相對比較困難,適合想深入學習構建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用下列的方法二構建交叉工具鏈。
方法二: 通過Crosstool-ng腳本工具來實現一次編譯,生成交叉編譯工具鏈,該方法相對於方法一要簡單許多,並且出錯的機會也非常少,建議大多數情況下使用該方法構建交叉編譯工具鏈。
方法三 : 直接通過網上下載已經製作好的交叉編譯工具鏈。該方法的優點不用多說,當然是簡單省事,但與此同時該方法有一定的弊端就是局限性太大,因為畢竟是別人構建好的,也就是固定的,沒有靈活性,所以構建所用的庫以及編譯器的版本也許並不適合你要編譯的程序,同時也許會在使用時出現許多莫名其妙的錯誤,建議讀者慎用此方法。
crosstool-ng是一個腳本工具,可以製作出適合不同平台的交叉編譯工具鏈,在進行製作之前要安裝一下軟體:
$ sudo apt-get install g++ libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk
crosstool腳本工具可以在http://ymorin.is-a-geek.org/projects/crosstool下載到本地,然後解壓,接下來就是進行安裝配置了,這個配置優點類似內核的配置。主要的過程有以下幾點:
1. 設定源碼包路徑和交叉編譯器的安裝路徑
2. 修改交叉編譯器針對的構架
3. 增加編譯時的並行進程數,以增加運行效率,加快編譯,因為這個編譯會比較慢。
4. 關閉JAVA編譯器 ,減少編譯時間
5. 編譯
6. 添加環境變數
7. 刷新環境變數。
8. 測試交叉工具鏈
到此,嵌入式Linux系統移植四大部分的第一部分工作全部完成,接下來可以進行後續的開發了。
第二部分:bootloader的選擇和移植
01 Boot Loader 概念
就是在操作系統內核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬體設備、建立內存空間的映射圖,從而將系統的軟硬體環境帶到一個合適的狀態,以便為最終調用操作系統內核准備好正確的環境,他就是所謂的引導載入程序(Boot Loader)。
02 為什麼系統移植之前要先移植BootLoader?
BootLoader的任務是引導操作系統,所謂引導操作系統,就是啟動內核,讓內核運行就是把內核載入到內存RAM中去運行,那先問兩個問題:第一個問題,是誰把內核搬到內存中去運行?第二個問題:我們說的內存是SDRAM,大家都知道,這種內存和SRAM不同,最大的不同就是SRAM只要系統上電就可以運行,而SDRAM需要軟體進行初始化才能運行,那麼在把內核搬運到內存運行之前必須要先初始化內存吧,那麼內存是由誰來初始化的呢?其實這兩件事情都是由bootloader來乾的,目的是為內核的運行准備好軟硬體環境,沒有bootloadr我們的系統當然不能跑起來。
03 bootloader的分類
首先更正一個錯誤的說法,很多人說bootloader就是U-boot,這種說法是錯誤的,確切來說是u-boot是bootloader的一種。也就是說bootloader具有很多種類,
由上圖可以看出,不同的bootloader具有不同的使用范圍,其中最令人矚目的就是有一個叫U-Boot的bootloader,是一個通用的引導程序,而且同時支持X86、ARM和PowerPC等多種處理器架構。U-Boot,全稱 Universal Boot Loader,是遵循GPL條款的開放源碼項目,是由德國DENX小組開發的用於多種嵌入式CPU的bootloader程序,對於Linux的開發,德國的u-boot做出了巨大的貢獻,而且是開源的。
u-boot具有以下特點:
① 開放源碼;
② 支持多種嵌入式操作系統內核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;
③ 支持多個處理器系列,如PowerPC、ARM、x86、MIPS、XScale;
④ 較高的可靠性和穩定性;
⑤ 高度靈活的功能設置,適合U-Boot調試、操作系統不同引導要求、產品發布等;
⑥ 豐富的設備驅動源碼,如串口、乙太網、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;
⑦ 較為豐富的開發調試文檔與強大的網路技術支持;
其實,把u-boot可以理解為是一個小型的操作系統。
04 u-boot的目錄結構
* board 目標板相關文件,主要包含SDRAM、FLASH驅動;
* common 獨立於處理器體系結構的通用代碼,如內存大小探測與故障檢測;
* cpu 與處理器相關的文件。如mpc8xx子目錄下含串口、網口、LCD驅動及中斷初始化等文件;
* driver 通用設備驅動,如CFI FLASH驅動(目前對INTEL FLASH支持較好)
* doc U-Boot的說明文檔;
* examples可在U-Boot下運行的示常式序;如hello_world.c,timer.c;
* include U-Boot頭文件;尤其configs子目錄下與目標板相關的配置頭文件是移植過程中經常要修改的文件;
* lib_xxx 處理器體系相關的文件,如lib_ppc, lib_arm目錄分別包含與PowerPC、ARM體系結構相關的文件;
* net 與網路功能相關的文件目錄,如bootp,nfs,tftp;
* post 上電自檢文件目錄。尚有待於進一步完善;
* rtc RTC驅動程序;
* tools 用於創建U-Boot S-RECORD和BIN鏡像文件的工具;
05 u-boot的工作模式
U-Boot的工作模式有 啟動載入模式和下載模式 。啟動載入模式是Bootloader的正常工作模式,嵌入式產品發布時,Bootloader必須工作在這種模式下,Bootloader將嵌入式操作系統從FLASH中載入到SDRAM中運行,整個過程是自動的。 下載模式 就是Bootloader通過某些通信手段將內核映像或根文件系統映像等從PC機中下載到目標板的SDRAM中運行,用戶可以利用Bootloader提供的一些令介面來完成自己想要的操作,這種模式主要用於測試和開發。
06 u-boot的啟動過程
大多數BootLoader都分為stage1和stage2兩大部分,U-boot也不例外。依賴於cpu體系結構的代碼(如設備初始化代碼等)通常都放在stage1且可以用匯編語言來實現,而stage2則通常用C語言來實現,這樣可以實現復雜的功能,而且有更好的可讀性和移植性。
1、 stage1(start.s代碼結構)
U-boot的stage1代碼通常放在start.s文件中,它用匯編語言寫成,其主要代碼部分如下:
(1) 定義入口。由於一個可執行的image必須有一個入口點,並且只能有一個全局入口,通常這個入口放在rom(Flash)的0x0地址,因此,必須通知編譯器以使其知道這個入口,該工作可通過修改連接器腳本來完成。
(2)設置異常向量(exception vector)。
(3)設置CPU的速度、時鍾頻率及中斷控制寄存器。
(4)初始化內存控制器 。
(5)將rom中的程序復制到ram中。
(6)初始化堆棧 。
(7)轉到ram中執行,該工作可使用指令ldrpc來完成。
2、 stage2(C語言代碼部分)
lib_arm/board.c中的start armboot是C語言開始的函數,也是整個啟動代碼中C語言的主函數,同時還是整個u-boot(armboot)的主函數,該函數主要完成如下操作:
(1)調用一系列的初始化函數。
(2)初始化flash設備。
(3)初始化系統內存分配函數。
(4)如果目標系統擁有nand設備,則初始化nand設備。
(5)如果目標系統有顯示設備,則初始化該類設備。
(6)初始化相關網路設備,填寫ip,c地址等。
(7)進入命令循環(即整個boot的工作循環),接受用戶從串口輸入的命令,然後進行相應的工作。
07 基於cortex-a8的s5pc100bootloader啟動過程分析
s5pc100支持兩種啟動方式,分別為USB啟動方式和NandFlash啟動方式:
1. S5PC100 USB啟動過程
[1] A8 reset, 執行iROM中的程序
[2] iROM中的程序根據S5PC100的配置管腳(SW1開關4,撥到4對面),判斷從哪裡啟動(USB)
[3] iROM中的程序會初始化USB,然後等待PC機下載程序
[4] 利用DNW程序,從PC機下載SDRAM的初始化程序到iRAM中運行,初始化SDRAM
[5] SDRAM初始化完畢,iROM中的程序繼續接管A8, 然後等待PC下載程序(BootLoader)
[6] PC利用DNW下載BootLoader到SDRAM
[7] 在SDRAM中運行BootLoader
2. S5PC100 Nandflash啟動過程
[1] A8 reset, 執行IROM中的程序
[2] iROM中的程序根據S5PC100的配置管腳(SW1開關4,撥到靠4那邊),判斷從哪裡啟動(Nandflash)
[3] iROM中的程序驅動Nandflash
[4] iROM中的程序會拷貝Nandflash前16k到iRAM
[5] 前16k的程序(BootLoader前半部分)初始化SDRAM,然後拷貝完整的BootLoader到SDRAM並運行
[6] BootLoader拷貝內核到SDRAM,並運行它
[7] 內核運行起來後,掛載rootfs,並且運行系統初始化腳本
08 u-boot移植(基於cortex_a8的s5pc100為例)
1.建立自己的平台
(1).下載源碼包2010.03版本,比較穩定
(2).解壓後添加我們自己的平台信息,以smdkc100為參考版,移植自己s5pc100的開發板
(3).修改相應目錄的文件名,和相應目錄的Makefile,指定交叉工具鏈。
(4).編譯
(5).針對我們的平台進行相應的移植,主要包括修改SDRAM的運行地址,從0x20000000
(6).「開關」相應的宏定義
(7).添加Nand和網卡的驅動代碼
(8).優化go命令
(9).重新編譯 make distclean(徹底刪除中間文件和配置文件) make s5pc100_config(配置我們的開發板) make(編譯出我們的u-boot.bin鏡像文件)
(10).設置環境變數,即啟動參數,把編譯好的u-boot下載到內存中運行,過程如下:
1. 配置開發板網路
ip地址配置:
$setenv ipaddr 192.168.0.6 配置ip地址到內存的環境變數
$saveenv 保存環境變數的值到nandflash的參數區
網路測試:
在開發開發板上ping虛擬機:
$ ping 192.168.0.157(虛擬機的ip地址)
如果網路測試失敗,從下面幾個方面檢查網路:
1. 網線連接好
2. 開發板和虛擬機的ip地址是否配置在同一個網段
3. 虛擬機網路一定要採用橋接(VM--Setting-->option)
4. 連接開發板時,虛擬機需要設置成 靜態ip地址
2. 在開發板上,配置tftp伺服器(虛擬機)的ip地址
$setenv serverip 192.168.0.157(虛擬機的ip地址)
$saveenv
3. 拷貝u-boot.bin到/tftpboot(虛擬機上的目錄)
4. 通過tftp下載u-boot.bin到開發板內存
$ tftp 20008000(內存地址即可) u-boot.bin(要下載的文件名)
如果上面的命令無法正常下載:
1. serverip配置是否正確
2. tftp服務啟動失敗,重啟tftp服務
#sudo service tftpd-hpa restart
5. 燒寫u-boot.bin到nandflash的0地址
$nand erase 0(起始地址) 40000(大小) 擦出nandflash 0 - 256k的區域
$nand write 20008000((緩存u-boot.bin的內存地址) 0(nandflash上u-boot的位置) 40000(燒寫大小)
6. 切換開發板的啟動方式到nandflash
1. 關閉開發板
2. 把SW1的開關4撥到4的那邊
3. 啟動開發板,它就從nandflash啟動
㈨ ubuntu系統板卡 怎麼使用3g網卡 apn
ubuntu使用3g網卡linux內核自帶已編譯好的rndis_host.ko模塊。直接運行命令:#modprode rndis_host 即可,’這時,應該linux'主機應該能夠識別插在主機上的usb網卡。這個命令,同時安裝了rndis_host.ko和usbnet.ko,這兩模塊。通過命令:# lsmod grep rndis_host可查看。另外,要查看系統安裝的所有模塊,可進入/proc/moles查看,正常情況,需要有rndis_host usbnet cdc_ether三個模塊即可實現usb網卡的上網。其中cdc_ether為開機被載入的模塊。要想卸載rndis_host模塊,運行命令:modprode -r rndis_host 即可,它同時卸載usbnet模塊。當然在linux上操作了網路設置相關後,最好/etc/init.d/networking restart 重啟網路。
㈩ linux下如何使用USB口無線網卡
Linux系統下使用USB無線網卡需要進行驅動的安裝及其配置,操作方法如下:
1、在配置無線網卡之前,必須確保內核設置中啟動了無線區域網支持。
#grepCONFIG_NET_RADIO/boot/config-『uname–r』CONFIG_NET_RADIO=y
2、安裝linux-wlan-ng-0.2.1-pre25.tar.gz,內核必須用源碼編譯過,接下來解壓並安裝。
#tar-zxvflinux-wlan-ng-0.2.1-pre25.tar.gz#cdlinux-wlan-ng-0.2.1-pre25
#./Configure
3、在/etc/wlan/wlan.conf里,設置自己的ssid。
SSID_wlan0="mywlan"
ENABLE_wlan0=y
4、創建一個wlancfg-mywlan文件。
#cd/etc/wlan
#cpwlancfg-DEFAULTwlancfg-mywlan
5、在/etc/moles.conf中加入一行代碼。
aliaswlan0prism2_usb
6、插上USB無線網卡,指示燈亮。
#ifconfigwlan0up
7、然後就可以給wlan0配置地址了。
#ifconfigwlan0inet6addfec0:106:2900::1/64
#ifconfigwlan0
#該命令看無線網卡的一些信息(包括ssid等)