文章目录

  • 一、前言
  • 二、硬件环境
    • 1. Exynos4412 (USB 2.0 Host Controller)
    • 2. USB3503 (USB HUB)
    • 3. DM9621 (USB Device)
  • 三、移植步骤
    • 1. 移植USB Host Controller驱动
    • 2. 使能USB3503 Hub
    • 3. 移植DM9621驱动
  • 四、总结
  • 参考

一、前言

   由于目前没有支持网卡驱动,所以 uboot 网络相关的命令都使用不起来,很不方便 (一直使用 fastboot 命令来烧写,因为我只有平板一条数据线,所以想给平板充电就成了一个问题),如果能用网络烧写那就方便多了。

   又看到已经有大佬完成,那更要学习学习。

大佬文章链接:

  • Uboot-2017-11移植DM9621网卡专题【目录汇总】

二、硬件环境

1. Exynos4412 (USB 2.0 Host Controller)

   Exynos4412 SOC内部集成了USB 2.0的主机控制器,默认Uboot是不支持USB功能的,主机驱动都是三星官方提供的,只需要我们做一定配置,编译进去便可支持。下面为功能块图,详细细节请查阅手册。

2. USB3503 (USB HUB)

   核心板板载一个USB HUB IC,也就是USB3503,与SOC和DM9621直接相连。因其使用和配置简单,我们只需要将其CTL pin进行相应的IO操作,便可使其正常工作,连接起SOC和下端的DM9621,主要的原理图如下。

3. DM9621 (USB Device)

   最后是Davicom DM9621 USB转Ethernet网卡芯片,控制与数据传输都是通过USB总线。这里需要操作CTL pin去使能该芯片,再做相应的寄存器配置,便可正常驱动该芯片。通过USB总线与SOC进行通信,Uboot有封装完善的USB接口,非常方便。移植成功后,便可以使用Uboot的网络工具,如tftpboot, 进行相应的网络通信,下面为其主要的原理图。

三、移植步骤

1. 移植USB Host Controller驱动

   该部分驱动已经有三星官方提供到Uboot主线中,我们下载的源码包里面已经有对应的代码,drivers/usb/host/ehci-exynos.c 文件包含了其实现。我们要做的只是将其编译选项打开,编译进Uboot最终bin文件中即可,下面给出详细的步骤。

1.1 打开编译选项

  • Kconfig中打开主机驱动宏,对应路径如下
 Device Drivers  --->[*] USB support  ---> [*]   EHCI HCD (USB 2.0) support


  • 打开Exynos4412对应的宏 CONFIG_USB_EHCI_EXYNOS

仿照 include/configs/odroid.h 第 177 行,也添加这样两行到 include/configs/xhr4412.h 中,定义这个宏就可以了。

/* USB */
#define CONFIG_USB_EHCI_EXYNOS

  • 打开Uboot的USB命令宏,对应路径如下
 Command line interface  ---> Device access commands  --->[*] usb

1.2 修改设备树

  • 加入ehci设备描述信息,如下:
 ehci@12580000 {compatible = "samsung,exynos-ehci";reg = <0x12580000 0x100>;#address-cells = <1>;#size-cells = <1>;status = "okay";/* In order to reset USB ethernet, DM9621 RESET IO pin */samsung,vbus-gpio = <&gpc0 1 0>;phy {compatible = "samsung,exynos-usb-phy";reg = <0x125B0000 0x100>;};};


1.3 编译与调试

   在上述操作编译完成后,就能使用USB主机控制器了,在终端键入 usb start 便可以看到有相应的USB信息输出,接下来便可以进行 USB 3503 的配置与使能。

2. 使能USB3503 Hub

2.1 配置GPIO

   根据前面文章《USB和Ethernet协议了解与原理图分析的分析》,USB 3503 Hub芯片配置简单,只需要做些IO操作便可。通过地板原理图核心板原理图查找分析,需要操作 GPM3_3 (USB3503_CONNECT)GPM2_4 (USB3503_RESET)。这里使用Uboot的IO驱动模型,而不是直接写寄存器,通过对应的宏和标准GPIO接口调用,便可以完成对USB Hub芯片的初始化,下面给出代码。

  • board/samsung/xhr4412/xhr4412.c

exynos_init() 函数中添加 usb gpio 的操作。

int exynos_init(void)
{#ifdef CONFIG_CMD_USBdebug("---> ready to init usb3503\n");/* USB3503A Connect */gpio_request(EXYNOS4X12_GPIO_M33, "USB3503A Connect");/* USB3503A Reset */gpio_request(EXYNOS4X12_GPIO_M24, "USB3503A Reset");/* USB3503A Disconnect, Reset, Connect */gpio_direction_output(EXYNOS4X12_GPIO_M33, 0);gpio_direction_output(EXYNOS4X12_GPIO_M24, 0);gpio_direction_output(EXYNOS4X12_GPIO_M24, 1);gpio_direction_output(EXYNOS4X12_GPIO_M33, 1);
#endifreturn 0;
}


2.2 编译与调试

   在执行完这步骤的时候,执行 usb start; usb reset; usb tree 后,便会有下面的对应输出,说明 USB 3503 已经在正常工作了,并且DM9621网卡已经使能了,接下来就是初始化并配置设备和适配到DM_ETH模型的操作了。

xhr4412 # usb start
starting USB...
Bus ehci@12580000: USB EHCI 1.00
scanning bus ehci@12580000 for devices... 1 USB Device(s) foundscanning usb for storage devices... 0 Storage Device(s) found
xhr4412 # usb reset
resetting USB...
Bus ehci@12580000: USB EHCI 1.00
scanning bus ehci@12580000 for devices... 3 USB Device(s) foundscanning usb for storage devices... 0 Storage Device(s) found
xhr4412 # usb tree
USB device tree:1  Hub (480 Mb/s, 0mA)|  u-boot EHCI Host Controller |+-2  Hub (480 Mb/s, 2mA)|+-3  See Interface (480 Mb/s, 180mA)?  xhr4412 #

3. 移植DM9621驱动

   在上面的步骤执行完,可以发现DM9621设备已经使能,能在USB总线上看到该设备了,接下来需要初始化和配置,并根据DM_ETH模型来提供相应的操作集便可。

3.1 移植开始

   根据上篇文章《Uboot DM_USB与DM_ETH模型》所介绍,我们需要提供以下标准接口:

  • 设备驱动
  • 设备驱动操作集
  • 设备
  • 设备相关接口(因物理设备而异)

   drivers/usb/eth/ 目录下有很多类似的 usb 网卡驱动,可以仿照其中的驱动来写我们的驱动。

创建文件:

  • drivers/xhr4412_driver/dm9601_eth.c

设备驱动

U_BOOT_DRIVER(dm9601_eth) = {.name = "dm9601_eth",.id = UCLASS_ETH,.probe = dm9601_eth_probe,.ops = &dm9601_eth_ops,.priv_auto_alloc_size = sizeof(struct dm9601_private),.platdata_auto_alloc_size = sizeof(struct eth_pdata),
};

设备驱动操作集

static const struct eth_ops dm9601_eth_ops = {.start            = dm9601_eth_start,.send           = dm9601_eth_send,.recv            = dm9601_eth_recv,.free_pkt        = dm9601_free_pkt,.stop            = dm9601_eth_stop,.write_hwaddr    = dm9601_write_hwaddr,
};

设备

static const struct usb_device_id dm9601_eth_id_table[] = {{ USB_DEVICE(0x07aa, 0x9601), }, /* Corega FEther USB-TXC */{ USB_DEVICE(0x0a46, 0x9601), }, /* Davicom USB-100 */{ USB_DEVICE(0x0a46, 0x6688), },   /* ZT6688 USB NIC */{ USB_DEVICE(0x0a46, 0x0268), },    /* ShanTou ST268 USB NIC */{ USB_DEVICE(0x0a46, 0x8515), }, /* ADMtek ADM8515 USB NIC */{ USB_DEVICE(0x0a47, 0x9601), },    /* Hirose USB-100 */{ USB_DEVICE(0x0fe6, 0x8101), },    /* DM9601 USB to Fast Ethernet Adapter */{ USB_DEVICE(0x0fe6, 0x9700), },   /* DM9601 USB to Fast Ethernet Adapter */{ USB_DEVICE(0x0a46, 0x9000), },   /* DM9000E */{ USB_DEVICE(0x0a46, 0x9620), },   /* DM9620 USB to Fast Ethernet Adapter */{ USB_DEVICE(0x0a46, 0x9621), },   /* DM9621A USB to Fast Ethernet Adapter */{ USB_DEVICE(0x0a46, 0x9622), },  /* DM9622 USB to Fast Ethernet Adapter */{ USB_DEVICE(0x0a46, 0x0269), },   /* DM962OA USB to Fast Ethernet Adapter */{ USB_DEVICE(0x0a46, 0x1269), },  /* DM9621A USB to Fast Ethernet Adapter */{}, // END
};

关键接口

DM9621系列网卡为USB转以太网卡设备,在主线中已经有相关的驱动框架使用,我们需要使用 usb_ether.c 文件中的关键接口,如下:

  • usb_ether_register
  • usb_ether_deregister
  • usb_ether_receive
  • usb_ether_advance_rxbuf
  • usb_ether_get_rx_bytes

ueth_data结构体

struct ueth_data {/* eth info */
#ifdef CONFIG_DM_ETHuint8_t *rxbuf;int rxsize;int rxlen;            /* Total bytes available in rxbuf */int rxptr;          /* Current position in rxbuf */
#elsestruct eth_device eth_dev; /* used with eth_register *//* driver private */void *dev_priv;
#endifint phy_id;           /* mii phy id *//* usb info */struct usb_device *pusb_dev;  /* this usb_device */unsigned char  ifnum;      /* interface number */unsigned char ep_in;      /* in endpoint */unsigned char  ep_out;     /* out ....... */unsigned char  ep_int;     /* interrupt . */unsigned char  subclass;   /* as in overview */unsigned char   protocol;   /* .............. */unsigned char   irqinterval;    /* Intervall for IRQ Pipe */
};


3.2 具体实现

   首先需要实现 struct eth_ops 里的接口和对应的 probe 接口,如何实现可以参考 driver/usb/eth/asix.c;对设备内部的操作,可以移植 linux 内核驱动里面的 driver/net/usb/dm9601.c 中的实现到 Uboot 框架即可。

    说起来简单,不过真的要把接口都对上那肯定得用不少功才行,看得出大佬也调试了挺久的。

    Uboot 网卡移植遇到的问题与解决方法

3.3 编译配置

   本次移植是基于 DM_ETH 和 DM_USB 模型移植的,需要先使能如下配置:

  • CONFIG_DM_USB=y
  • CONFIG_DM_ETH=y
  • CONFIG_NET=y
  • CONFIG_CMD_USB=y
  • CONFIG_CMD_NET=y
  • CONFIG_USB_HOST_ETHER=y
  • CONFIG_USB_ETHER_DM9601=y

   由于大佬之前已经移植好了,拿到手上修改了一些头文件就可以编译通过。


3.4 调试

问题一

  • Misaligned operation at range
xhr4412 # ping 192.168.177.128
CACHE: Misaligned operation at range [7ae6e5ef, 7ae6e600]
CACHE: Misaligned operation at range [7ae6e5ef, 7ae6e600]
CACHE: Misaligned operation at range [7ae6e5ef, 7ae6e600]
Using dm9601_eth device
host 192.168.177.128 is alive
xhr4412 #

   该问题是由于某些变量没有按照 cache 对齐,将 dm_read_reg() 等函数做适当的修改,都使用 ALLOC_CACHE_ALIGN_BUFFER 宏定义的 buff 就可以解决该问题。


问题二

  • EHCI timed out on TD - token=0x8008d80
xhr4412 # run nfs
Waiting for Ethernet connection... done.
Using dm9601_eth device
File transfer via NFS from server 192.168.177.128; our IP address is 192.168.177.132
Filename '/home/xhr/iTop4412/xhr4412/linux/xhr4412-linux-5.8.5/xhr4412-uImage.bin'.
Load address: 0x40007000
Loading: EHCI timed out on TD - token=0x88008d80
Rx: failed to receive: -5
T ###################################################################################################################################################################################################################################################################################################################################################################################EHCI timed out on TD - token=0x8008d80
Rx: failed to receive: -5
T EHCI timed out on TD - token=0x8008d80
Rx: failed to receive: -5
T EHCI timed out on TD - token=0x88008d80
Rx: failed to receive: -5
EHCI timed out on TD - token=0x8008d80
Rx: failed to receive: -5
T EHCI timed out on TD - token=0x88008d80
Rx: failed to receive: -5done
Bytes transferred = 5223344 (4fb3b0 hex)
xhr4412 # bootm 40007000 - 41000000

   drivers/usb/eth/asix.c 第 460 行有说到多延时一下,就可以避免这个问题?

 /** Wait some more to avoid timeout on first transfer* (e.g. EHCI timed out on TD - token=0x8008d80)*/mdelay(25);
  • [Solved] EHCI timed out on TD - token=XXXX

   这篇帖子写得很不错,是个大佬,大概意思是说这个问题和不同的硬件有关系,怪不得这个板子启动 linux 后,挂载 nfs 文件系统,有时 10 秒就可以挂载成功,有时要几十秒甚至一分多钟,也会打出 Waiting up to 100 more seconds for network. 的 log,就是在等待 usb 设备准备好吧。

   那这个问题暂时不管了,虽然印的 warning log 比较让人心烦,但是并没有影响使用,通过网络下载的 uboot、kernel 都可以正常运行,再也不需要使用 fastboot 了。

四、总结

   有前面大佬的开路,移植起来就轻松多了,半天就移植成功了。感谢大佬们的努力。

   warning log 看着还是挺烦人的,以后看能不能解决。

参考

  • Uboot-2017-11移植DM9621网卡专题【目录汇总】
  • USB和Ethernet协议了解与原理图分析的分析
  • Uboot DM_USB与DM_ETH模型
  • Uboot 网卡移植遇到的问题与解决方法
  • [Solved] EHCI timed out on TD - token=XXXX

[2020-09-24]
   将 reset usb gpio 的代码放到 do_usb_start() 函数中更合理。

[xhr4412][extension 4] u-boot-2020.07 DM9621 网卡驱动移植相关推荐

  1. 初识Linux Kernel 移植 之 dm9621网卡驱动移植

    初识Linux 驱动移植 -- dm921 概述 配置内核 dm9621 网卡驱动编译配置选项 问题探索 读 dm9621 MAC 地址失败 网卡反复断开重连 概述 将kernel移植到开发板并能正常 ...

  2. Uboot DM9621网卡移植之路

    前言 根据前面文章USB和Ethernet协议了解与原理图分析.DM_USB和DM_ETH模型简介所介绍,想必大家已经知道移植的流程应该是如何了,这里再简单的给出大致步骤,如下. 移植USB Host ...

  3. 2020.07 学习日记

    废话 寒假到现在,在家里玩了5个月,来学校又玩了大半个月.以为会做点东西了就什么都懂了,竟然没做准备就投了字节秋招提前批.结果被挂了之后,又被捞起来面试.可以说十分幸运了,但机会都是留给有准备的人 2 ...

  4. 第十弹:网络公开课,免费学习资源,2020.07.05更新

    第十弹:网络公开课,免费学习资源,2020.07.05更新 按照个人兴趣整理的网络公开课资源导航网址:http://www.trochilidaetechnology.com/ 以下为[网络公开课]领 ...

  5. 猎人手游最新服务器,【猎人mm服务端】2020.07月升级經典手工制作搭建网游服务器...

    [猎人mm服务端]2020.07月升级經典手工制作搭建网游服务器 修改标的物的设置,并修改标的物的销售和价格.修改精制道具的价格,并与掉落的道具统一. 无人岛的经验值增加了紫圣诞鹿(经验值是圣诞怪物的 ...

  6. 312戳气球——力扣算法系列2020.07.19 Python

    第25天 2020.07.19 周日 难度系数:困难 题目:有n个气球,编号为0到n-1,每个气球上都标有一个数字,这些数字存在数组nums中. 现在要求你戳破所有的气球.如果你戳破气球i,就可以获得 ...

  7. [xhr4412][extension 6] 使用 Ralink USB_DEVICE(0x148f, 0x3070) 无线网卡

    文章目录 前言 一.内核网卡驱动 1. 配置 2. 测试 二.libnl 三.wpa_supplicant 1. build 2. rootfs 3. test hostapd & dhcp ...

  8. 有线网卡驱动_WDS如何为boot.wim或install.wim添加驱动

    问题描述: 使用WDS为某些机型部署系统时,可能会出现无法引导的情况,比如某一款笔记本PXE引导后会弹出提示"WdsClient: 从 DHCP 服务器获取 IP 地址时出错.请检查以确保在 ...

  9. 全志平台boot框架中增加设备驱动过程分析

    全志平台boot框架中增加设备驱动过程分析 在boot启动阶段,大家都知道他的主要目的就是引导uboot,uboot在引导内核,从而让整个系统运作起来.全志的boot阶段,对应平板这一块,它会驱动LC ...

最新文章

  1. 说说设计模式~大话目录(Design Pattern)
  2. 使用UISearchDisplayController
  3. spotify歌曲下载_使用Spotify数据预测哪些“ Novidades da semana”歌曲会成为热门歌曲
  4. 数据安全:英国公司泄露超过100万人的指纹和面部识别数据
  5. pytorch之mnist数据集存放位置以及本地加载
  6. 螺旋进刀非法平面选择_进刀方法、刀片类型、术语...螺纹加工重点知识你都知道吗?...
  7. CodeForces 589J Cleaner Robot
  8. [转载] python type() 判断数据类型
  9. 大数据的趋势走向如何
  10. 关于Big Sur 中获取 macOS Monterey Safari 标签的方法
  11. Linux虚拟机设置Samba服务
  12. PowerDesigner安装教程
  13. 华为hcip认证考试内容是什么?hcip认证有哪些方向
  14. Sklearn聚类算法之Affinity Propagation
  15. 打开注册表regedit
  16. Tomcat升级版本出现400问题
  17. Gazebo仿真场景搭建+配置
  18. 银保监会回应中国金融机构数据被公开售卖:绝大部分系黑客伪造拼凑
  19. 深度linux安装宝塔,Linux 安装宝塔
  20. 网络安全运营中心的3个主要要素

热门文章

  1. 电脑定时关机、取消定时关机、滑动关机
  2. win10希望计算机做什么取消,主编设置win10设置和取消定时关机的解决形式
  3. python300行代码_Python:游戏:300行代码实现俄罗斯方块
  4. 2017.3.15 贾老分享有感
  5. MATLAB画区域专题地图(省边界)
  6. Android实现计时器(Handle+Runable)
  7. QuickTime Player教程_如何捕捉 iPhone、iPad 或 iPod touch 屏幕?
  8. C# -> (Cshape)笔记
  9. python输出随机字符串代码
  10. 本地电脑ssh连接机器人,使用rviz控制机器人导航