初识Linux 驱动移植 -- dm921

  • 概述
  • 配置内核
    • dm9621 网卡驱动编译配置选项
  • 问题探索
    • 读 dm9621 MAC 地址失败
    • 网卡反复断开重连

概述

将kernel移植到开发板并能正常加载和启动内核后,发现网卡并没有工作,因此将网卡作为第一个移植的实践。这篇文章用于记录移植dm9621网卡过程中遇到的问题以及如何定位问题并尝试解决。

配置内核

在找到dm9621网卡驱动的源码后,需要将其添加到内核,并编译到内核去不采用动态加载模块,需要做哪些修改呢?这需要通过内核配置菜单来配置,将dm9620.c(dm9621 网卡驱动源码)拷贝到 driver/net/usb 目录下,通过配置该目录下Kconfig 和 Makefile 来决定。

//Kconfig 添加(添加dm9620 编译选项):
+config USB_NET_DM9620
+   tristate "Davicom DM9620/21 based USB 2.0 10/100 ethernet devices"
+    depends on USB_USBNET
+    select CRC32
+   help
+       This option adds support for Davicom DM9620 based USB 2.0
+      10/100 Ethernet adapters.
+
+     This driver creates an interface named "ethX",where X depends on
+      what other networking devices you have in use.
+
+      To compile this driver as a module.choose M here.//Makefile 添加(CONFIG_USB_NET_DM9620 为 y时编译进内核,为 M 时编译成模块):
+ obj-$(CONFIG_USB_NET_DM9620)    += dm9620.o  

添加好之后就可以通过 make menuconfig来配置了,由于dm9621是usb类型网卡,因此需要依赖于usb 网络框架:

Device Drivers  --->   [*] Network device support  ---> USB Network Adapters  ---> <*> Multi-purpose USB Networking Framework<*>   Davicom DM9620/21 based USB 2.0 10/100 ethernet devices

dm9621 网卡驱动编译配置选项

问题探索

读 dm9621 MAC 地址失败

在kernel的启动信息中可以看到dm9620 相关的启动信息中有这样一条信息:

(unregistered net_device): Error reading MAC address

这信息来源在 调用usbnet_probe()函数(usbnet.c)中调用bind函数时读取MAC地址失败,目标网卡设备未注册。通过添加调试来排查dm9620驱动注册是否成功,下面是dm9620驱动注册过程中函数调用关系:

usb_register()    // module_init(usb_register)usb_register_driver()    // 注册一个 USB interface 驱动driver_register()    // 总线型驱动注册(dm9620 是usb类型)bus_add_driver()    // 将驱动添加到总线(将dm9620驱动添加到usb总线)driver_attach()    // 将驱动绑定到设备bus_for_each_dev()    // 设备迭代器,查找所有的设备,并调用回调函数__driver_attach()    // 绑定查找到的设备driver_match_device()    // 实现驱动和设备的匹配工作driver_probe_device()    // 如果匹配成功会调用该函数,将设备和驱动进行绑定

通过添加调试信息,在执行调用driver_match_device函数后会由于匹配dm9620驱动和设备失败返回,而不调用driver_probe_device函数进行设备和驱动的绑定。分析到这就猜测是不是设备的问题,通过使用lsusb命令,发现并没有dm9621 的usb网卡设备,因此推测应该是网卡设备没有被发现导致注册失败。而这个网卡设备是通过usb3503A hub连接到开发板的,在使用lsusb命令时同样没有发现3053 usb设备,因此呢这个usb设备也没有被发现。通过查看usb3503A 的初始化操作,发现原代码使用的GPIO引脚并非板子上usb3503 链接的引脚,因此需要修改usb3503A 的reset 和 connect 引脚:

// 位于板子配置初始化文件中 arch/arm/mach-exynos/mach-smdk4x12.c
// usb_hub_gpio_init() 对usb3503 引脚进行初始化
- #define GPIO_HUB_RESET EXYNOS4_GPL2(2)
- #define GPIO_HUB_CONNECT EXYNOS4_GPK3(2)
+ #define GPIO_HUB_RESET EXYNOS4212_GPM2(4)
+ #define GPIO_HUB_CONNECT EXYNOS4212_GPM3(3)

通过修改上面的修改,重新编译加载内核后,再次使用lsusb命令,可以查看到已经发现了usb3503 和 dm9621 设备:

网卡反复断开重连

通过之前的修改,虽然已经发现了网卡设备,但是发现网卡设备会发生2~3次的被发现和断开,下面是kernel中dm9620驱动相关的启动信息:

这是怎么回事呢?这种现象很像是多次插拔了usb网卡,通过开发板的原理图发现,dm9621 的RSTB引脚是链接到4412芯片的GPC0_1 引脚,猜测可能该引脚被多次的配置,因为将这个引脚拉低会初始化dm9621 ,因此会造成这种类似的现象。通过搜索,发现GPC0_1 在原码中被当成其他引脚功能使用,因此将这些使用了该引脚代码注释掉(在s3c-fb.c 和setup-fb-s5p.c中引用,原因是暂时还没找到这些原码应该使用哪个才是正确的引脚)。同时在板级初始化函数中添加对dm9621的初始化:

static void __init smdk4x12_machine_init(void)
{
……
+ #ifdef CONFIG_USB_NET_DM9620
+  dm9620_reset();
+ #endif
}
+ #ifdef CONFIG_USB_NET_DM9620
+ static void __init dm9620_reset(void)
+ {
+  int err = 0;+ err = gpio_request_one(EXYNOS4_GPC0(1), GPIOF_OUT_INIT_HIGH, "DM9620_RESET");
+  if (err)
+      pr_err("failed to request GPC0_1 for DM9620 reset control\n");+  s3c_gpio_setpull(EXYNOS4_GPC0(1), S3C_GPIO_PULL_UP);
+  gpio_set_value(EXYNOS4_GPC0(1), 0);+   mdelay(1000); //dg change 5 ms to 1000ms for test dm9620 + gpio_set_value(EXYNOS4_GPC0(1), 1);
+  gpio_free(EXYNOS4_GPC0(1));
+}
+ #endif

初识Linux Kernel 移植 之 dm9621网卡驱动移植相关推荐

  1. [xhr4412][extension 4] u-boot-2020.07 DM9621 网卡驱动移植

    文章目录 一.前言 二.硬件环境 1. Exynos4412 (USB 2.0 Host Controller) 2. USB3503 (USB HUB) 3. DM9621 (USB Device) ...

  2. AM335x(TQ335x)学习笔记——Nandamp;amp;网卡驱动移植

    移植完成声卡驱动之后本想再接再励,移植网卡驱动,但没想到的是TI维护的内核太健壮,移植网卡驱动跟之前移植按键驱动一样简单,Nand驱动也是如此,于是,本人将Nand和网卡放在同一篇文章中介绍.介绍之前 ...

  3. 驱动程序之_3_网络设备_3_网卡驱动移植

    驱动程序之_3_网络设备_3_网卡驱动移植 网卡出厂一般都会有驱动程序模板,网卡接到不同的Cpu上,引脚.参数有所不同,移植过程要做的就是根据硬件修改引脚地址.参数 一般来说,需要修改的是片选引脚.中 ...

  4. linux 网卡驱动编译,在linux系统下安装编译网卡驱动的方法

    安装linux操作系统后发现没有网卡驱动,表现为 system → Administration → Network下Hardware列表为空. 以下为安装编译网卡驱动的过程,本人是菜鸟,以下是我从网 ...

  5. 基于嵌入式Linux的千兆以太网卡驱动程序设计及测试

    基于嵌入式Linux的千兆以太网卡驱动程序设计及测试 一. 引言 千兆以太网是一种具有高带宽和高响应的新网络技术,相关协议遵循IEEE 802.3规范标准.采用和10M以太网相似的帧格式.网络协议和布 ...

  6. linux4.1内核配置以及编译及千兆网卡dp83867网卡驱动移植

    一  内核配置编译 1首先解压内核 tar jxvf linux-at91-4.1.tar.bz2: 2下载编译链 在ubuntu命令行中输入sudo apt-get install gcc-arm- ...

  7. 0 【Ubuntu/Linux】Ubuntu18.04有线连接图标不见(Linux系统安装2.5G有线网卡驱动,亲测避坑)

    前言 本人电脑安装的是windows10+Ubuntu18.04双系统,不是Linux虚拟机!!!!(虚拟机的网络问题需要看别的文章了) 本人的电脑是微星B560M MOTAR主板,该主板的网卡是2. ...

  8. uboot网卡驱动移植

    uboot网卡驱动移植 定义相应的宏,使能uboot的网卡 添加ping和tftp命令 移植网口初始化代码 注册网卡 定义相应的宏,使能uboot的网卡 官方的uboot默认是不使能网卡相关的代码的, ...

  9. 关于国嵌 实验2 5 网卡驱动移植 网卡地址 的问题

    实验2.5 网卡驱动移植 网卡地址等几个宏的数值怎么得到的 实验2.5 网卡驱动移植中有几个宏 #define CONFIG_DM9000_BASE 0x20000300 #define DM9000 ...

最新文章

  1. java随机产生若干个偶数完成求和_java - 创建随机生成器以生成并计算奇数对偶数 - 堆栈内存溢出...
  2. 《数据科学:R语言实现》——3.12 估计缺失数据
  3. 16年寒假随笔(2)
  4. Python 实现有道翻译命令行版
  5. 每日一博 - Spring Boot Application as a Service
  6. 二维码图像去噪文献调研(1)--Real Image Denoising with Feature Attention
  7. c# 静态构造函数与私有构造函数共存
  8. 微信公众号迁移具体内容
  9. idea导入tomcat源码
  10. Fragment的使用
  11. lm324 -4运放-运算放大器
  12. java实现手机扫描二维码下载功能
  13. 智能家居更智能,小程序的生态合作新方案
  14. 中国十大电子商务网站排名
  15. 世界上最快的计算机-泰坦和天河二号
  16. 【中亦安图】运维无小事之一次导致数据丢失的小变更(10)
  17. 怎样取消开机硬盘自检?
  18. 【XSS漏洞03】XSS漏洞验证、语句构造与绕过方法
  19. 掌纹与掌静脉融合matlab代码,一种基于人脸和掌纹掌静脉识别的身份比对方法与流程...
  20. 用批处理删除指定字符之前或之后的所有内容(FOR /F 中的Delims和Tokens总结)

热门文章

  1. 网页防篡改技术的前世与今生
  2. win10预装软件卸载工具
  3. 怎么给php加音乐,视频中添加背景音乐 怎么给视频添加背景 给视频中某段加背景音乐...
  4. k8s集群部署springboot项目
  5. 华为v8原生态android,安卓原生系统的手机有哪些_2019安卓原生系统手机推荐_飞翔教程...
  6. 【校招VIP】互联网校招项目实习对项目的要求不重要?大错特错!你忽略掉的项目考察重点都在这里!
  7. 【cec14_func】修改版
  8. python是跨平台的 以及 py、pyc、pyo
  9. 瑞吉外卖笔记——第03讲Linux软件安装jdk、MySQL、Tomcat和Maven
  10. 网页中嵌入视频播放器代码