USB网卡驱动分析(rt8152)

USB设备驱动程序分析

最近一直在搞zynq的PL部分,为了保持对驱动程序的敏感度,看着源码分析一下rt8152的驱动程序。之前学单片机一直想着给单片机装一个USB网卡,但是一直没有思路。今天突然想到之前的想法,就带着这个想法加上对内核驱动的怀念,写一下,写点东西有时候能让人的心平静点。

USB总线和USB设备

usb总线是一种常见的高速总线,其实也不算高,usb2.0规定没记错应该是480Mbit/s。物理层上,usb high使用的是差分电压型串行数据线。usb full采用的是差分电流型串行串行数据线。差分抗干扰源于模拟电路的一个差动放大器,放大差模信号,抑制共模信号。再来说一下为什么高速数据总线喜欢用电流来传输信号。我们知道当导线距离增加时,其电阻会增加,那么从发送端到接收端的电压就会发生变化。使用电流传输,在发送端放置一个电流源,无论电阻怎么变换,流过电阻的电流总是恒定的。只要在接收端的端接电阻保持稳点就可以了。
简单介绍完物理层以后,在说一下USB通信的过程。很重要的一点是每次USB通信的发起者都是主机。这点很重要,至于USB的中断传输模式、块传输。。。网上好多,这里只写一些实用的、简单的。
在linux设备驱动中,把usb控制器的驱动程序可以看成是usb总线驱动程序,在设备树中定义了usb控制器的设备节点,控制器通过和设备树匹配,获取到usb控制器的基地址、中断号等资源。这部分程序一般不需要驱动工程师去修改,一般芯片厂商会写好。一般情况下,需要关心的是USB设备驱动程序,也就是挂在USB总线上的设备。通俗的讲就是u盘,usb声卡,usb暖手宝(这算吗☺)。

USB设备匹配方式

usb设备的匹配不需要在设备树中进行定义,而是通过vid和pid。这是usb控制器在在完成热插拔以后做的一项检测工作,会从usb的端点0中读取usb的vid和pid,然后在和已经装在的usb驱动程序进行匹配。

static struct usb_device_id rtl8152_table[] = {
	{REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8152)},
	{REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8153)},
	{REALTEK_USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101)},
	{REALTEK_USB_DEVICE(VENDOR_ID_LENOVO,  0x7205)},
	{REALTEK_USB_DEVICE(VENDOR_ID_LENOVO,  0x304f)},
	{REALTEK_USB_DEVICE(VENDOR_ID_NVIDIA,  0x09ff)},
	{}
};

这是usb网卡的设备ID匹配表。当usb设备接到usb总线上,如果正确匹配,probe函数就会被执行。

思考

  1. usb设备驱动的PID和VID能不能动态配置?
  2. usb设备驱动程序中的VID和PID万一重复怎么办?

网络设备驱动程序分析

网卡设备驱动分析

之前写过一篇 linux网卡设备驱动(任意传输介质传输(与FPGA交互)) 大致说了下网卡驱动程序的结构以及怎么实现一个网络驱动程序。
这里在赘述一下,网卡驱动程序在probe函数中:

  1. struct net_device *netdev;定义网络设备结构体;
  2. netdev = alloc_etherdev(sizeof(struct r8152));分配空间
  3. 填充该结构体;
  4. ret = register_netdev(netdev);注册该设备;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值