㈠ 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等)