QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6557|回复: 4

usbnet的模块如何用?

[复制链接]
发表于 2005-4-6 12:31:56 | 显示全部楼层 |阅读模式
通用串行总线(USB)是一种快速而灵活地连接配件与计算机工作站的接口,其应用非常广泛。Linux中除了包含对USB主机控制器的驱动,还含有USB设备控制器,尤其是集成在StrongARM SA1110处理器上的控制器的驱动。这些控制器驱动通过使用USB可使基于Linux的嵌入式系统与主机 (运行的可以是Linux,或不是)进行通信。这里提供三种方法给运行Linux操作系统的嵌入式系统增加USB支持,可采用其中一种与USB主机展开通信。
第一种,最复杂的设备采用专门编写的内核模块解析标准USB总线上通行的错综复杂的高层协议;相应的USB主机定制驱动和应用程序来完成连接。第二种,有些基于Linux的设备把总线当作一种简单的运行在主机上的点对点串行连接使用;主机应用程序采用主机操作系统提供的USB编程界面,而其外在表现则仿佛是在通过一种典型的串行端口进行通信。第三种,另有一些设备把USB看作一种以太网络,它们用主机作网关,把USB设备与办公LAN或 Internet相连接。通常的做法是使用专门的主机驱动实现它。
最佳方案的选择取决于研发所需时间,以及针对具体嵌入式应用,要把USB接口作成什么样。以下对这三种方法如何在基于Linux的USB设备上的应用逐一进行描述。本文是关于如何在基于Linux的照相机和PDA之类的USB设备上使用Linux的论述,在此,USB是指由方形连接器而非扁平矩形连接器构成的USB设备。

内核模块
把USB加到基于Linux的设备上的第一种方法是编写一个定制的Linux内核模块。这种方法通常要求相应开发主机操作系统(Windows、Linux以及其它OS)的驱动。
借助定制内核模块在设备中的安装,可以进行文件系统仿真等,使嵌入式应用将其USB主机当作远程存储设备对待。这一方法的另一潜在用途是构成一种存储转发字符设备,从嵌入式应用程序中缓冲数据流,直到USB主机连接完成建立为止。
对于基于StrongARM的Linux设备,其USB应用内核模块调用sa1100_usb_open(),对管理芯片的板上USB设备控制器外设的内核代码进行初始化。然后该模块调用sa1100_usb_get_descriptor_ptr()和 sa1100_usb_set_string_descriptor(),通过枚举过程对USB主机的给定USB描述符进行设置。这些描述符包括设备供货商及产品的数字标识符、正文字符串等主机可用来对设备进行识别的信息。甚至有一个序列号域,以便主机唯一地识别设备或对USB上相同设备的多个实例加以区分。
内核模块必须在开始USB通信前完成USB描述符的建立,这是因为枚举过程由USB设备控制器驱动,一旦USB主机连上后会自动执行。一切准备就绪后,USB设备模块便调用sa1100_usb_start(),告诉内核接受来自主机的USB连接请求。如果模块在USB主机连上前调用 sa1100_set_configured_ callback(),那么内核将会在枚举过程结束时调用所提供的回调函数。回调函数能很好地对设备完成连接状态进行可视化指示。
如果USB通信不再需要,那么设备的内核模块便调用sa1100_usb_stop(),然后是 sa1100_usb_close(),关闭SA1100的USB控制器。
StrongARM USB控制器支持数据传输作业的bulk-in 和bulk-out。在从USB主机接收数据包时,内核模块调用sa1100_usb_recv(),把数据缓冲区和回调函数地址传递给它。然后内核的底层USB设备控制代码对来自主机的bulk-out包进行检索,把内容放于缓冲区中,并调用回调函数。
回调函数必须从接收缓冲区提取数据并保存于其它位置或者把缓冲区空间加到一个队列中,为下一个数据包的接收分配新的缓冲区。而后回调函数二次调用sa1100_usb_recv(),在需要时进行下一个数据包的接收。过程与对USB主机的数据传输相类似。在聚集起一帧的数据量后,内核模块将数据的地址、长度和回调地址传递给 sa1100_usb_send()。传输完成时,内核调用回调函数。
主机
主机端USB驱动的几个例子在主流的Linux版本以及 Linux内核档案组织分配的原始内核源中都有提供。用于Handspring Visor(drivers/usb/serial/visor.c)的模块是编写较为简洁易懂的模块之一,作为USB主机端模块的模板 (drivers/usb/usb-skeleton.c)使用。

高速串行
对于大多数实际应用来说, 可以把USB总线当作一种高速串行端口考虑。如此在某些类型的嵌入式设备和应用中对它进行原型模拟是有意义的。StrongARM处理器的Linux内核提供现成的USB设备驱动专工于此,称作usb-char。
在希望与USB主机通信时,Linux USB设备应用程序只是打开对其usb-char设备节点(字符型,最大10,最小240)的连接,然后开始读写数据即可。read()和 write()操作将一直返回错误值直到USB主机连上为止。一旦连接建立和枚举完成,便开始通信,就像USB是一种点对点串行端口一样。
由于这种USB数据传递方法十分直接且实用,因此usb-char设备得到高效使用。它还为其它USB通信方法的实现提供了重要的参照基准。
usb-char的实际动作从usbc_open()功能开始,部分内容示于列表1中。
列表1:打开USB上的串行连接
static int usbc_open(struct inode *pInode, struct file *pFile)
{
int retval = 0;
/* start usb core */
sa1100_usb_open(_sb-char?;
/* allocate memory for in-transit USB packets */
tx_buf = (char*) kmalloc(TX_PACKET_SIZE, GFP_KERNEL | GFP_DMA);
packet_buffer = (char*) kmalloc(RX_PACKET_SIZE, GFP_KERNEL | GFP_DMA);
/* allocate memory for the receive buffer; the contents of this
buffer are provided during read() */
rx_ring.buf = (char*) kmalloc(RBUF_SIZE, GFP_KERNEL);
/* set up USB descriptors */
twiddle_descriptors();
/* enable USB i/o */
sa1100_usb_start();
/* set up to receive a packet */
kick_start_rx();
return 0;
twiddle_descriptors ()功能建立起设备的USB描述符。在描述符全部建起后,准备从USB主机枚举并接收一个数据帧。kick_start_rx()所需的代码大多数情况下只是一种对sa1100_usb_recv() 的调用以建立回调而已。当USB主机发送数据包时,设备的内核通过回调调用rx_done_callback_packet_buffer()函数,把数据包的内容移入usb-char 设备点上由read()返回的FIFO队列。
主机
对于运行Linux的USB主机,usb-char相应的USB主机模块称为usbserial模块。大多数Linux版本都包括Usbserial模块,尽管通常不是自动装入。在USB与设备的连接建立之前,usbserial 由modprobe 或 insmod载入。
一旦USB设备开始枚举,主机上的应用程序便用usbserial设备点(字符型,最大188,最小0以上)之一与设备进行通信。这些节点通常命名为/dev/ttyUSBn。Usbserial模块在内核报文日志记录中报告它把哪个节点指定给USB设备使用:
usbserial.c: 通用转换器删除
usbserial.c: 通用转换器当前连到ttyUSB0上。连接建立后,USB主机上的应用程序便通过读写指定的节点与USB设备进行通信。
Linux 主机上usbserial模块的一种替代选择是一种称作libusb(libusb.sourceforge.net)的库。这种库使用低层内核系统调用进行USB数据传输,而不是通过usbserial模块,在某种程度上跨Linux内核版本建立和使用时更方便。Libusb库还提供大量有用的调试功能,这一点在对运行在USB链路上的复杂通信协议进行除错时有帮助。用libusb与采用usb-char的USB设备进行通信时,Linux主机应用程序使用usb_open()函数建立与该设备的连接。然后应用程序使用usb_bulk_read()和usb_bulk_write()与设备交换数据。

USB上的以太网
另一种选择是把USB作为一种以太网络来对待。Linux具有在主机和设备端均可实现这种功能的模块。由于iPAQ硬件既没有可接入的串行端口也没有一种专用的网络接口,因此,iPAQ 的Linux内核专门采用这种通信策略,在StrongARM的Linux内核中,usb-eth模块(arch/arm/mach- sa1100/usb-eth.c)对用USB作物理媒介的虚构以太网设备进行仿真。一旦创建后,这一网络界面便被指定一个IP地址,否则作为通常的以太网硬件对待。一旦USB主机连上后,usb-eth模块便能使USB设备“看到” Internet(如果存在Internet的话),ping测其它IP地址,甚至“谈论”DHCP, HTTP, NFS, telnet, 和e-mail。简言之,任何在实际的以太网界面上运行的应用将不折不扣地在usb-eth接口上得到实现,因为它们不能分辨出其正在使用的不是实在的以太网硬件。
主机
在Linux主机上,相应的Ethernet-over-USB内核模块称为usbnet。当usbnet模块得到安装且设备的USB连接建立完成时,usbnet模块便针对主机端内核及用户应用创建一个与实际硬件酷似的虚构以太网界面,主机端应用程序通过运行设备IP地址 ping测,可以检查USB设备的存在。如果ping测成功,设备便加上了。

结语
Linux不再只是USB主机使用,当今它也是USB设备的合适选择,Linux 下的USB通信是非常灵活和易用的。(锄禾译)
 楼主| 发表于 2005-4-6 13:57:55 | 显示全部楼层
I've added a USB type B (device) connector to my tux and used it to network the tux to a linux box with a standard USB A-B cable.

I wired up the following circuit into my tux:



J602/8---27.4---------
                 |   |
                475k |
                 |   |  ----NC
                gnd  |  |
J600/1---------      2  1
              |       ==      USB type B   1 VBUS
             1k5     3  4                  2 D-
              |      |  |                  3 D+
J602/7---27.4--------|  gnd                4 gnd
                     |                     sheild:  Do not connect.
                    475k
                     |
J602/10-------------gnd

27.4,475k and 1k5 are small resistors.

J600/1   3v3

J602/7   UDC+
J602/8   UDC-
J602/10  gnd

Keep the wires short and twist together the two that connect to pins 2 and 3
on the USB connector, and also the 2 to J602/7 and 8.

A USB type B (device) connector:



I modified the appropriate tux kernel config file to contain:

CONFIG_SA1100=y
CONFIG_SA1100_USB=m
CONFIG_SA1100_USB_NETLINK=m

this got me the usb-eth.o and sa1100usb_core.o modules in /lib/modules/2.4.18-rmk6-tux1/kernel/arch/arm/mach-sa1100/

I loaded these modules with:

insmod sa1100usb_core
insmod usb-eth

and configured the usbf network device thus:

ifconfig usbf 10.0.1.1

On the linux host side I configured the kernel build to get the usbnet.o
module, which I loaded and configured with:

insmod usbnet
ifconfig usb0 inet 10.0.1.2 netmask 255.255.255.0

There are a number of ways to configure this network, see:

http://www.linux-usb.org/usbnet/

http://mstempin.free.fr/linux-ipaq/html/connecting-to-the-lan.html
http://www.linux-usb.org/usbnet/
回复

使用道具 举报

 楼主| 发表于 2005-4-7 09:51:34 | 显示全部楼层
1.编辑/etc/hotplug/blacklist
加入CDCEther
2.modprobe usbnet
然后当你插上pda以后
通过ifconfig -a
就会看到一个新增的设备usb0
然后配置到和你的pda一个网段,双方就可以通信了

Host Cable 把 Pin 4 & 5 直接短路並不是很正確的作法
PIN 4 是 ID PIN, 依照下圖的規格來製作的話, 正確的方法應該是在 PIN 4 和
PIN 5 中串接一個 10 歐姆的電阻.

Contact    singnal          Typical Wieing Assignment
1          VBUS                          Red
2          D-                            White
3          D+                            Green
4          ID                            <10 to GND
5          GND                           BLack
Shell      Shield                        Dirain Wire
回复

使用道具 举报

 楼主| 发表于 2005-4-7 10:34:16 | 显示全部楼层
如何安装pdaxrom

1.认识操作:z机有4种操作模式。这里介绍需要用的3种。
**正常操作模式。
**OK模式。去掉电池和电源,5秒以上时间。重新装上电池和电源。按住OK键的同时,开启电源开关。会进入OK模式。菜单有4个选项。
1忽略、2查找错误、3格式化、4 升级。以后我们主要用到第4项——升级。
附:格式化的功能。见我的另帖中的有关介绍。

**DM模式。即工厂调试模式。去掉电池和电源,5秒以上。然后按住D和M键的同时,装上电池。(小技巧:操作时,可将右手按住D和M,机身支在台子上,左手装电池。)这时进入DM模式。如果没有进入,主要是操作上有某键未按牢,可重新来过。
!DM模式中3页主要选项。第3页中还可以有一个扩展选项,共有4页。这些都对硬件的操作。主要用于工厂出厂时,对屏幕、笔触、各端口、内存、版本的操作。
!强烈建议:初次进入者别乱按。极有可能出不来的~~。当然熟悉后,操作无妨。因为Z机器就是用来玩的啊。
**退出工序:关闭电源。去掉电池和电源(如果连上),5秒以上。开机。
**注意DM模式下操作,请电池充足。防止意外。

2。彻底的备份和恢复(“回家”的路)
——备份
**进入DM模式。
**翻到第3页。
**上面有一个关于backup的选项。按指示操作,可以将你机器ROM中(相当于硬盘)的资料(OS+App),全部备份到CF或SF卡上,共有66M(即标准的64M)。文件名是:SL7500C.DBK。小建议:请将这份文件收好了,最好烧录SONY的光盘中(其他烧录盘好象~~)。
**退出工序。
——恢复:
**进入DM模式
**翻到第3页
**上面有一个关于restore的选项。按提示操作,直到OK。
**退出DM工序
**开机将进入原来的画面。

3。下载OS核心。
RC9.0在这里:http://www.pdaxrom.org/index.php?showid=40&menuid=11
RC9.1在这里:http://mirror1.pdaxrom.org/rc9.1/
**两者取其一下载。
**解压到CF或SD卡上。
**共有5个文件。其中sum5的文件是,检验码。主要验证你下载得是否正确。
(如果不正确,请用gtar解压(linux下)。或在linux环境下下载。)

4。安装:
过程是先分区->装新系统(->格式化用户分区,安装新系统后,机器会自动进行。).与安装windows的过程差不多。
——分区
**进入OK模式
**选第4项:update(升级)
**选择CF或SD(视你的5个文件“所在地”)
**新菜单。选第3项,叫nandrom操作那个。
**新菜单。先第一项。分区的那个。
**分区大小选46。
**完成。
**会reboot(重启)。这时,不要让他进行下去,你去掉电源和电池~~进入刷新ROM
——装新系统。
***选第4项:update(升级)
**选择CF或SD(视你的5个文件“所在地”)
**新菜单。选第1项,叫刷新ROM操作那个。
**一切按提示操作。直到reboot.(重新启动)
这时机器升级完成 。
**reboot过程约有3分钟。
**见到login:输入root
**出现linux提示符#后,输入startx.

以上安装过程结束。说起来话长,做起来极简单。5分钟而已。
好运各位!
回复

使用道具 举报

发表于 2005-4-13 19:38:03 | 显示全部楼层
好东西,我的s3c2410可以试一下就好了,怎么操作?
谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-5 13:42 , Processed in 0.041182 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表