前言:最近折腾下,分析了下uboot的u***接口网卡,就u***模块操作(操作)这些却是可怕的,我也不太懂你。在uboot添加自己的u***接口网卡,自带uboot里已经做好了u***设置的(arch/arm/cpu/arm920t/s3c24x0/u***_ohci.c文件提供了u***的操作函数,发送数据包,初始化等。。。)。
一,怎么样在uboot使用u*** start ,u*** scan命令
uboot里可以列出文档目录,里面的文件README.u***提供了方法:
How it works:
USB(至少是USB UHCI) 需要一个帧列表 (4k)、传输
描述符和队列头,这些都位于主存储器中。
UHCI 每毫秒分配一次 PCI 总线并读取当前
帧指针。这可能会导致操作系统在引导期间崩溃。所以
在操作系统启动期间USB _MUST_ 被停止。这就是为什么 USB
在启动过程中不会自动启动的原因。如果有人需要USB
他必须启动它,因此应该知道他必须
在启动操作系统之前停止它。
对于 USB 键盘,这可以通过
在 U-Boot 启动并运行后自动启动的脚本来完成。要使用
USB 键盘启动操作系统,还需要另一个脚本,该脚本首先禁用
USB,然后执行启动命令。如果引导命令失败,
脚本可以重新启用 USB kbd。
常用 USB 命令:
- USB 启动:
- USB 重置:(重新)启动 USB。所有 USB 设备都将被
初始化并为它们构建一个设备树。
- u*** 树:以树状显示所有 USB 设备,如 display
- u*** info [dev]:显示设备 dev 或所有的所有 USB 信息
设备
- USB 停止 [f]:停止 USB。如果 f==1,如果
USB 键盘被分配为标准输入,USB 也会停止。然后标准输入
切换到串行输入。
USB 存储命令:
- u*** 扫描:扫描 USB 以查找存储设备
。此命令必须运行USB (USB 启动)
- u*** 设备 [dev]:显示或设置当前 USB 存储设备
- u*** 部分 [dev]:打印分区一个或所有 USB 存储
设备的表
- u*** read addr blk# cnt:
读取从块 `blk#‘’‘’ 开始到
内存地址 `addr‘’‘’ 的`cnt‘’‘’ 块
- u***boot addr dev:part:
Config Switches: 我们去配置文件
/include/configs/xxx.h添加这几个宏就可以了----------------CONFIG_CMD_USB 启用基本的 vmUSB 支持和 u*** 命令 CONFIG_USB_UHCI
定义低级部分。
如果使用 CONFIG_CMD_USB
CONFIG_USB_KEYBOARD 启用 USB 键盘,则必须定义低级部分 CONFIG_USB_STORAGE
启用 USB 存储设备
CONFIG_USB_HOST_ETHER 启用 USB 以太网适配器支持 重
编译uboot,烧录,重启uboot 输入 u*** start 就发现 u***b 开始工作了
。怎么添加u***接口的网卡
我们先查代码去一步一步分析,我们在用nfs时,会大概经过这么
几个过程static voidNfsSend (void) { /*nfs发送函数*/
nfs_read_req
rpc_req
NetSendUDPPacket /*把数据打包成UDP*/
eth_send /×发送数据包×/
eth_current-》send(eth_current, packet, length); /×
用我们注册的eth_device提供的send函数去发送×/
在net/eth.c提供了一个eth_register(struct eth_device *dev)
这个函数,我们这个只要写一个驱动,在驱动里去分配,设置,注册这个eth_device结构体就了。结构体提供发送数据包,接收数据包,初始化函数等。思想就是这样的。
三。利用uboot提供好的u***接口网络设备框架
实际上uboot里已经写好了一个u***接口网络设备的框架,我们只要去了解,然后写硬件部分就可以
在uboot的cmd_u***.c文件里定了一个
U_BOOT_CMD(
u***, 5, 1, do_u***,
“USB sub-system”,
“ start - 启动(扫描)USB 控制器/n”
“u*** reset - 重置(重新扫描)USB 控制器/n”
“u*** stop [f] - 停止USB [f]=force stop/n”
“
”u*** info [dev] - 显示可用的 USB 设备/n“
”u*** storage - 显示 USB 存储设备的详细信息/n“
”u*** dev [dev] - 显示或设置当前的 USB 存储设备/n“
”u*** part [dev] - 打印一个或所有 USB 存储器的分区表“
” devices/n“
”u*** read addr blk# cnt - 读取从块 `blk#‘’‘’/n“
”开始的 `cnt‘’‘’ 块到内存地址 ` addr‘’‘’/n“
”u*** write addr blk# cnt -
从内存地址 `addr‘’‘’“ 从块 `blk#‘’‘’/n” “开始写入 `cnt‘’‘’ 块
);
结构体。
当我们在uboot下输入u*** 相关命令时会调用
do_u***
do_u*** -- cmd_u***.c
u***_host_eth_scan(1) { --u***_ether.c
探针有效驱动程序(开发);--u***_ether.c
eth_register(eth); --u***_ether.c
我们分析这个u***_ether.cc文件,我们发现了一个数组:u***_eth_prob_dev prob_dev[]static const struct u***_eth_prob_dev prob_dev[] = { #ifdef CONFIG_USB_ETHER_ASIX { .before_probe = asix_eth_before_probe, .eth_info_get_probe, .eth_get_info, 。 }, #endif #ifdef CONFIG_USB_ETHER_SMSC95XX { .before_probe = smsc95xx_eth_before_probe, .probe = smsc95xx_eth_probe, .get_info = smsc95xx_eth_get_info, }, #endif
。。。。。。,照我们的
END卡* 。。。。;
四。如何写u***接口网卡驱动,实际readme.u***文件里有详细的介绍
USB主机网络
如果您有受支持的 USB 以太网适配器,您可以在 U-Boot 中使用它
来获取 IP 地址并从网络服务器加载内核。
注意:USB 主机网络与使您的电路板充当 USB
客户端不同。在这种情况下,您的电路板会伪装成以太网适配器
,并将显示为连接计算机的网络接口。在这种
情况下,连接是通过 USB 电缆与作为主机的计算机进行的。
使用 USB 主机网络,您的开发板就是 USB 主机。它控制着
它直接连接的以太网适配器,
与外界的连接是您的适配器的以太网电缆。您的开发板成为
独立的网络设备,能够连接并执行网络操作
独立于您的计算机。
设备支持
当前支持的设备根据
其供应商和产品 ID列在驱动程序中。您可以通过将设备连接
到 Linux 机器并输入 ‘’‘’lsu***‘’‘’来检查您的设备。驱动程序位于
drivers/u***/eth。
例如,这个 lsu*** 输出行显示了一个具有供应商 ID 0x0x95
和产品 ID 0x7720 的
设备:Bus 002 Device 010:ID 0b95:7720 ASIX Electronics Corp. AX88772
如果您查看 drivers/u***/eth/asix.c,您将看到这一行在
支持的设备列表中,所以我们知道支持此适配器。
{ 0x0b95, 0x7720 }, /* Trendnet TU2-ET100 V3.0R */
如果您的适配器未列出,它仍有可能
工作。尝试查找适配器内芯片的制造商。
或拆开适配器并寻找芯片标记。然后将
您的供应商/产品 ID的一行添加到相应驱动程序的表中,
构建 U-Boot 并查看它是否有效。如果不是,则
适配器中的芯片和驱动程序之间可能存在差异。您可以尝试
为您的设备获取数据表,并将对它的支持添加到 U-Boot。这个不是
特别难——你只需要提供对
init、halt、send、recv四个基本功能的支持。(我们添加自己网卡的发送,接收功能。。。)